基于上述,开发者需要一个比较完善的日志组件来实现日志记录的功能,目前比较流行的有两个日志框架,log4j,logback 这两个组件都是对slf4j接口的实现。这两个组件都同一作者开发的,logback相对log4j而言有了相对多的改进。但是两者的用法几乎差别不大。下面是logback的优势:
目前企业级的应用基本上都是使用logback,所以下文主要是对logbcak进行详解
一、使用logback日志框架我们需要引入如下maven依赖
ch.qos.logback
logback-classic
1.2.3
ch.qos.logback
logback-core
1.2.3
org.slf4j
slf4j-api
1.7.5
注:由于有时候需要用到比较新的特性,所以建议最好使用比较新的jar包
二、使用详解
logback基本配置文件基本内容如下:
${LOG_HOME}/logback-daily.log
[%-5p]%d,[%c{0}], %m%n%rEx{3}
UTF-8
${LOG_HOME}/logback-daily-%d{yyyy-MM-dd}.log.gz
10
其配置文件基本结构如下表示:
根节点是 configuration,可包含0个或多个 appender,0个或多个 logger,最多一个 root。
1、如果 logback 在启动时,解析配置文件时,出现了需要警告的信息或者错误信息,那 logback 会自动先打印出自身的状态信息。
如果希望正常情况下也打印出状态信息,可以在配置文件中,指定 configuration 的 debug 属性为 true。这个属性不配置默认为false
2、logback配置可实现自动加载,如果我们需要使用自动加载方式,需在configuration中加入如下属性
...
注:扫描间隔要加上单位,可用的单位是 milliseconds,seconds,minutes 和 hours。如果只指定了数字,但没有指定单位,这默认单位为 milliseconds。
3、设置变量
4、设置logger
5、日志打印级别
TRACE < DEBUG < INFO < WARN < ERROR
如果一个 logger 允许打印一条具有某个日志级别的信息,那么它也必须允许打印具有比这个日志级别更高级别的信息,而不允许打印具有比这个日志级别更低级别的信息。
6、appender详解
a、ConsoleAppender:把日志添加到控制台,有以下节点
配置如:
%-4relative [%thread] %-5level %logger{35} - %msg %n
配置如:
testFile.log
true
%-4relative [%thread] %-5level %logger{35} - %msg%n
TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
logFile.%d{yyyy-MM-dd}.log
30
%-4relative [%thread] %-5level %logger{35} - %msg%n
更多详细可以参考:https://logback.qos.ch/manual/encoders.html
三、使用过程中相关问题
1、%l 输出日志事件的发生位置,这个配置一定要慎用,%l是需要遍历调用栈,性能消耗比较大。在线上环境中,如果日志量比较大时很容易影响业务线程
2、对于并发量比较高或日志量比较大的服务,如果发现服务load比较高时,可以通过jvm的jstack打印出具体的调用栈信息,如果发现如下问题
则表示日志输出线程已经被阻塞了,这时会影响主要的业务线程,这时我们可以使用logback的一个比较高级的属性,异步日志输出,异步日志输出配置样例如下:(注:这种可能会导致日志丢失,需要自己评估,该功能需要高版本才能支持如 1.0.11)
UTF-8
[%-5p]%d,[%c{0}], %m%n%rEx{4}
${LOG_HOME}/wzpm/wzpm-daily-%d{yyyy-MM-dd}.log.gz
20
256
AsyncAppender主要有以下属性:
属性名 | 类型 | 描述 |
queueSize | int | BlockingQueue的最大容量,默认情况下,大小为256。 |
discardingThreshold | int | 默认情况下,当BlockingQueue还有20%容量,他将丢弃TRACE、DEBUG和INFO级别的event,只保留WARN和ERROR级别的event。为了保持所有的events,设置该值为0。 |
includeCallerData | boolean | 提取调用者数据的代价是相当昂贵的。为了提升性能,默认情况下,当event被加入到queue时,event关联的调用者数据不会被提取。默认情况下,只有"cheap"的数据,如线程名。 |
异步日志的工作原理可以参看:http://blog.csdn.net/chenjie2000/article/details/8902727