logback 入门
实战,我的原则是,先会使用,然后再来剖析下源码了解下原理
一、代码
1、pom.xml
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
2、logback.xml
<configuration scan="true" scanPeriod="60 second" debug="false">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread%X{sourceThread}]%logger{24} - %msg%n</pattern>
</encoder>
</appender>
<logger name="indi" level="info" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
3、Demo类,注意 package 路径
package indi.sword.logback.demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author jeb_lin
* 2:53 PM 01/03/2019
*/
public class Demo {
public static void main(String[] arg){
Logger logger = LoggerFactory.getLogger(Demo.class);
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
}
}
4、运行 Main 方法:输出到控制台:
2019-03-01 16:48:17 INFO [main]i.s.logback.demo.Demo - info
2019-03-01 16:48:17 WARN [main]i.s.logback.demo.Demo - warn
2019-03-01 16:48:17 ERROR [main]i.s.logback.demo.Demo - error
Process finished with exit code 0
5、输出到文件(xml加上appender代码)
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/var/tmp/logs/rolling01.log</file>
<!-- 文件压缩策略(按时间) -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件压缩路径与格式 -->
<fileNamePattern>/var/tmp/log/slog.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread%X{sourceThread}]%logger{24} - %msg%n
</pattern>
</encoder>
</appender>
<logger name="indi" level="info" additivity="false">
<appender-ref ref="FILE"/>
<appender-ref ref="STDOUT"/>
</logger>
6、继续执行 main 方法,可以看到刚刚控制台的输出写到了 /Users/Documents/temp/logs/rolling01.log
7、重点注意日志级别Level,从Log4j过来的要注意一下(多了个 Trace 少了个 fatal)
log4j :DEBUG、INFO、WARN、ERROR、FATAL
logback : TRACE、DEBUG、INFO、WARN、ERROR
二、解释XML含义
1、root 根结点(根Logger)
<logger name="indi" level="info" additivity="false">
<appender-ref ref="FILE"/>
<appender-ref ref="STDOUT"/>
</logger>
修改为:
<logger name="indi" />-
2、控制台输出了:(多了句 debug),未输出到文件
2019-03-01 17:17:21 DEBUG [main]i.s.logback.demo.Demo - debug
2019-03-01 17:17:21 INFO [main]i.s.logback.demo.Demo - info
2019-03-01 17:17:21 WARN [main]i.s.logback.demo.Demo - warn
2019-03-01 17:17:21 ERROR [main]i.s.logback.demo.Demo - error
原因:
a、 “indi” 的logger 未设置Level,那么继承父类 root 的 debug(刚刚例子“indi”自己设置的是 info),打印了4条记录
b、 “indi”的“additivity”未设置,默认true,也就是父类帮他打印。
c、他自己未设置 appender ,那么他自己不打印,他爸爸帮他打印就行。
c、父类 root 只打印到 STOUT 没打印到 FILE,所以就都听爸爸的。
3、additivity属性测试 (additivity 设置为 true)
<logger name="indi" level="info" additivity="true">
<appender-ref ref="STDOUT"/>
</logger>
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
</root>
控制台输出:(因为定义了两个 appender-ref ,所以打印出来了两份)
2019-03-01 17:36:01 INFO [main]i.s.logback.demo.Demo - info
2019-03-01 17:36:01 INFO [main]i.s.logback.demo.Demo - info
2019-03-01 17:36:01 WARN [main]i.s.logback.demo.Demo - warn
2019-03-01 17:36:01 WARN [main]i.s.logback.demo.Demo - warn
2019-03-01 17:36:01 ERROR [main]i.s.logback.demo.Demo - error
2019-03-01 17:36:01 ERROR [main]i.s.logback.demo.Demo - error
4、注意 logger name=“indi”,indi表示包名字,包路径越少范围越大,“indi”表示类的package为indi.*的logger都由他管理。比如刚刚那个Demo类,package为package indi.sword.logback.demo;就在 indi下面。
5、root 是所有logger的终极父类,所以我们测试下:logback.xml ,去掉其他logger
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 second" debug="false">
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread%X{sourceThread}]%logger{24} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
6、运行 Demo 类的Main方法,控制台输出:
2019-03-01 18:32:37 DEBUG [main]i.s.logback.demo.Demo - debug
2019-03-01 18:32:37 INFO [main]i.s.logback.demo.Demo - info
2019-03-01 18:32:37 WARN [main]i.s.logback.demo.Demo - warn
2019-03-01 18:32:37 ERROR [main]i.s.logback.demo.Demo - error
=============== 讲解结束 ===============
下篇预告:logback 的优点与代码剖析。