前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高性能logback

高性能logback

作者头像
十毛
发布2019-03-27 14:27:33
2.8K0
发布2019-03-27 14:27:33
举报

logback使用中,会因为日志量过大,导致请求响应时间太长。本文介绍几种常见提升logback性能的办法

异步Appender

异步是降低日志对请求耗时影响的最有效方法,首推使用!

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="logDir" value="${catalina.base}/logs" />
    <property name="commonPattern" value="[%thread][%level][%class{0}:%line]: %msg%n" />

    <appender name="ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logDir}/all.log</file>
        <encoder>
            <pattern>${commonPattern}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${logDir}/all.%d{yyyy-MM-dd}.log.zip</FileNamePattern>
            <maxHistory>15</maxHistory>
        </rollingPolicy>
    </appender>
   <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <includeCallerData>true</includeCallerData>
        <discardingThreshold>-1</discardingThreshold>
        <queueSize>1024</queueSize>
        <appender-ref ref="ALL" />
    </appender>

    <root level="DEBUG">
        <appender-ref ref="ASYNC" />
    </root>
</configuration>
  • queueSize 默认值256,不过该值首次建议设置大一些,后续根据自己业务的特点去调优,降低日志丢失的概率。
  • discardingThreshold:默认情况下,当blockingQueue的容量高于阈值时(80%),会丢弃ERROR以下级别的日志,如果不希望丢弃日志(既每次都是全量保存),那可以设置为0,但是如果队列满的时候,会丢弃所有插入队列的日志信息,所以建议设置为-1(默认值)。 如正常日志可以丢弃,那可以极大的提升性能,并保存关键的ERROR日志。
  • AsyncAppender中只能配置一个appender-ref,配置多个就会无效

不同环境不同配置

开发环境一般都把日志输出到ConsoleAppender,但是其他环境是不需要的,可以使用动态配置。

代码语言:javascript
复制
<root level="DEBUG">
    <appender-ref ref="ASYNC"/>
    <if condition='property("os.name").toUpperCase().contains("WINDOWS") || property("os.name").toUpperCase().contains("MAC")'>
        <then>
            <appender-ref ref="STDOUT"/>
        </then>
    </if>
</root>

pom.xml中需要添加依赖

代码语言:javascript
复制
<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>3.0.11</version>
</dependency>

过滤异常栈

异常栈可以非常有效地帮助定位问题,但是也会因为异常栈太长,包含了太多几乎无价值的信息,比如反射、动态代理、Spring、tomcat等调用信息。过滤掉这部分信息,既减少了日志量,也减少大对象的数量,降低Full GC的次数。常用配置如下:

代码语言:javascript
复制
<property name="commonPattern" value="[%thread][%level][%class{0}:%line]: %msg%n%rEx{full,
     java.lang.reflect.Method,
     sun.reflect,
     org.apache.catalina,
     org.springframework.aop,
     org.springframework.security,
     org.springframework.transaction,
     org.springframework.web,
     org.springframework.beans,
     org.springframework.cglib,
     net.sf.cglib,
     org.apache.tomcat.util,
     org.apache.coyote,
     ByCGLIB,
     BySpringCGLIB,
     com.google.common.cache.LocalCache$
}"/>

常见问题

  • 日志中的%class%line中没有显示正确的值,而是两个问号? 解决办法:一般出现在AsyncAppender中,需要添加属性<includeCallerData>true</includeCallerData>

参考

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.12.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 异步Appender
  • 不同环境不同配置
  • 过滤异常栈
  • 常见问题
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档