初探日志框架Logback
一. 背景
最近因为学习项目时需要使用logback日志框架来打印日志, 使用过程中碰到很多的疑惑, 而且需要在控制台打印mybatis执行的sql语句, 于是决定沉下心来
研究一下logback的使用。
二. Logback日志级别
Logback日志级别主要有7个, 分别为OFF>ERROR>WARN>INFO>DEBUG>TRACE>ALL
定义在ch.qos.logback.classic.Level类中, 一般只需用ERROR,WARN,INFO,DEBUG这四个级别就行了
Logback处理日志级别时一般遵从输出级别大于等于所声明的级别的日志。
三. Filter
自己常用的两个Filter为ch.qos.logback.classic.filter.LevelFilter, ch.qos.logback.classic.filter.ThresholdFilter, 其他的没有深究
LevelFilter: 如果指定lever为debug, 只处理debug级别的日志
ThresholdFilter: 如果指定lever为debug,只处理>=debug级别的日志
<filter>标签写在<appender>标签类, 用来指明<appender>标签处理日志的级别
四. <logger> 和 <root>
<logger>标签有3个属性
name: 可以为具体某个类, 或者一个包名(这样也会处理子包), 必选
lever: 可选, 声明级别, 不写默认继承上一级的lever
additivity: 值为true/false, 是否把打印日志传递到上一级中, 如果<logger>已经指定了<appender>, 应该将值置为false, 否则会重复打印, 即本身打印一次
上一级还会打印。如果没有指定<appender>, 则置为true, 值默认也为true
<root>为最顶层的上级, 上下级应该是根据包名来说的
指定的<logger>会处理对应包名的log, 根据additivity的值判断是否再交给上一级处理
<root>会处理剩下没有指定<logger>来处理的日志, 当然该<logger>的additivity值为true, 那么<root>也会处理该logger处理过的日志, 是一个最大的范围。
五. 处理日志级别的流程
如果级别大于 等于<root>或者<logger>设置的级别, 那么会继续与<appender>所设置的过滤方式比较, 否则直接拒绝.
六. 详细配置
<?xml version="1.0" encoding="UTF-8"?> <!-- 60秒扫描一次该配置文件是否有更改 --> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!--声明一个变量, 代表日志文件的根目录 --> <property name="LOG_HOME" value="E:/logs"/> <!--输出到控制台 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoding>UTF-8</encoding> <encoder> <!--打印格式 %d 日期 24小时制:分:秒.毫秒数 %p 日志级别优先级 %c 打印日志的全类名 %t 线程名 %m message, 打印的信息 %n 换行 --> <pattern>[%d{HH:mm:ss.SSS}][%p][%c{40}][%t] %m%n</pattern> </encoder> <!--处理日志级别, ThresholdFilter处理大于等于level标签声明的级别 onMatch=accept 符合上述所说级别, 本例大于等于DEBUG级别 onMismatch=deny 不符合拒绝不输出, 本例小于DEBUG级别 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 输出到文件, 日志级别对应info级别(只能info级别日志被输出) --> <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>${LOG_HOME}/info.log</File> <!--将日志按时间打包, 内容追加到文件后, 最大保留最近10天的日志记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/info.log.%d{yyyy-MM-dd}.gz</fileNamePattern> <append>true</append> <maxHistory>10</maxHistory> </rollingPolicy> <encoder> <pattern>[%d{HH:mm:ss.SSS}][%p][%c{40}][%t] %m%n</pattern> </encoder> <!--处理INFO, 不匹配直接拒接, LevelFilter只处理与level标签相同的级别 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 输出到文件, 日志级别对应ERROR级别(只能ERROR级别日志被输出) --> <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>${LOG_HOME}/error.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/error.log.%d{yyyy-MM-dd}.gz</fileNamePattern> <append>true</append> <maxHistory>10</maxHistory> </rollingPolicy> <encoder> <pattern>[%d{HH:mm:ss.SSS}][%p][%c{40}][%t] %m%n</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- mybatis sql 日志 --> <logger name="com.waston.dao" level="DEBUG" additivity="false"> <appender-ref ref="console" /> </logger> <!-- 整个项目 log 日志 --> <logger name="com.waston" level="DEBUG" additivity="false"> <appender-ref ref="error" /> <appender-ref ref="info" /> <appender-ref ref="console"/> </logger> <!--处理<logger>未处理的日志, 比如项目所引用别的框架的日志 --> <root level="DEBUG"> <appender-ref ref="console"/> <appender-ref ref="error"/> <appender-ref ref="info"/> </root> </configuration>
上述配置声明3个<appender>
控制台打印DEBUG级别以上的日志
INFO文件只打印INFO级别的日志
ERROR文件只打印ERROR级别的日志
七. 结语
记录使用logback的一些疑惑,供自己以后参考学习, 如有人看到指出错误将不胜感激。