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$ }" />