logback 性能优化

logback 性能优化

日志是服务中一个重要组成部分,当优化性能的时候,也要思考对日志的性能优化。

控制台日志

生产环境应该关闭控制台日志。可以减少不必要的开销。

获取行号

logback和log4j等日志框架获取行号的方式是相同的。即通过throw 时获取 StackTrace,然后从中解析出 文件名和行号。

1
2
3
4
5
6
7
public StackTraceElement[] getCallerData() {
if (callerDataArray == null) {
callerDataArray = CallerData
.extract(new Throwable(), fqnOfLoggerClass, loggerContext.getMaxCallerDataDepth(), loggerContext.getFrameworkPackages());
}
return callerDataArray;
}

在生产环境中可以不打印 文件名和行号来减少日志的性能消耗。

如果开启了异步Appender, 还要注意一个参数 includeCallerData

1
2
3
4
5
protected void preprocess(ILoggingEvent eventObject) {
eventObject.prepareForDeferredProcessing();
if (includeCallerData)
eventObject.getCallerData();
}
1
2
3
4
<appender name="access-async" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="access"/>
<includeCallerData>false</includeCallerData>
</appender>

过滤异常栈

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<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$
}"/>