6.第六章Logback
6.1Logback简介
Logback是由Log4j创始人设计的又一个开源日志组件。
Logback当前分成三个模块:logback-core,logback-classic和logback-access。
Logback-core是其他两个模块的基础模块,Logback-classic是Log4j的一个改良版本,此外logback-classic完整实现了Slf4j API,使你可以很方便地更换成其他日志系统如Log4j或JUL。
6.2Logback的组件
Logger:日志记录器,主要用于存放日志对象,也可以定义日志类型、级别。
Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等。
Layout:负责把事件转换成字符串,格式化的日志信息的输出,在Logback中Layout对象被封装在encoder中,也就是说我们未来使用的encoder其实就是Layout。
6.3 Logback配置文件
logback提供了3种配置文件:logback.groovy、logback-test.xml、logback.xml,如果都不存在,则使用默认配置。
6.4Logback日志输出格式
日志输出格式:
%-10level 级别 案例为设置10个字符,左对齐
%d{yyyy-MM-dd HH:mm:ss.SSS} 日期
%c 当前类全限定名
%M 当前执行日志的方法
%L 行号
%thread 线程名称
%m或者%msg 信息
%n 换行
6.5案例分析
首先我们创建一个maven项目,引入相关依赖,因为logback-core是logback-classic的基础模块,logback-classic已经涵盖logback-core这个依赖,根据maven依赖的传递性,不需要导入,只需要导入logback-classic就可以了。
<!-- 单元测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- slf4j日志门面依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- logback依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
logback有5种级别的日志输出,分别是tace < debug < info < warn < error,通过信息打印,我们了解到logback默认的日志级别是debug。
目前我们使用的是slf4j+logback组合来对日志信息进行记录,通过上一章Slf4j源码执行原理的分析我们了解到Slf4j在根据已添加日志实现框架来初始化LoggerFactory时,会去加载日志实现框架中的静态日志绑定类,如下图:
因为本次我们只引入了Logback日志实现依赖,我们来根据源码去找到Loback中的StaticLoggerBinder类,该类中进行了StaticLoggerBinder的初始化,并且我们从中可以看到getLoggerFactory()方法,该方法获取了Logback的日志工厂,通过Logback的日志工厂获取Logger对象进行日志记录操作,如下:
接下来,我们通过配置文件来对Logback日志进行配置管理,在resources路径下创建logback.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--
配置文件通用属性
<property name="" value=""></property>
所谓配置文件中的通用属性是为了让接下来的配置更加方便
通过以${name}的形式,方便的取得value值
通过取得的value值可以做文件的其他配置而使用
-->
<!--
我们在此可以先做日志输出格式的相关配置
%-10level 级别 案例为设置10个字符,左对齐
%d{yyyy-MM-dd HH:mm:ss.SSS} 日期
%c 当前类全限定名
%M 当前执行日志的方法
%L 行号
%thread 线程名称
%m或者%msg 信息
%n 换行
以property的形式将日志输出格式配置成为文件的通用属性
那么我们配置的输出方式中,就可以重复的引用改配置(以下的配置,对于输出格式就不用配置多次了)
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"></property>
<property name="htmlPattern" value="[%-5level]%d{yyyy-MM-dd HH:mm:ss.SSS}%c%M%L%thread%m%n"></property>
<!-- 配置文件输出路径 -->
<property name="logDir" value="D://my-projects//log-framework-study//logs"></property>
<!-- 配置控制台appender -->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!--
表示对于日志输出目标的配置
默认:System.out 表示以黑色字体输出日志
设置:System.err 表示以红色字体输出日志
-->
<target>
System.err
</target>
<!--
配置日志的输出格式
手动配置格式的方式
直接引用上述通用属性即可
-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式引用通用属性配置 -->
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 配置文件输出appender -->
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
<!-- 引入文件的位置 -->
<file>${logDir}/logback.log</file>
<!-- 设置输出格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 格式引用通用属性配置 -->
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 配置html文件appender -->
<appender name="htmlFileAppender" class="ch.qos.logback.core.FileAppender">
<!-- 引入文件的位置 -->
<file>${logDir}/logback.html</file>
<!-- 设置输出格式 -->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<!-- 格式引用通用属性配置 -->
<pattern>${htmlPattern}</pattern>
</layout>
</encoder>
</appender>
<!-- 配置文件appender 可拆分归档的文件 -->
<appender name="rollAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 设置输出格式 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!-- 引入文件的位置 -->
<file>${logDir}/roll_logback.log</file>
<!-- 指定拆分规则 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 按照时间和压缩格式声明文件名 压缩格式gz -->
<fileNamePattern>${logDir}/roll.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
<!-- 按照文件大小来进行拆分 -->
<maxFileSize>1KB</maxFileSize>
</rollingPolicy>
</appender>
<!-- 配置控制台appender 使用过滤器 -->
<appender name="consoleFilterAppender" class="ch.qos.logback.core.ConsoleAppender">
<target>
System.err
</target>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!-- 配置过滤器 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置日志的输出级别 -->
<level>ERROR</level>
<!-- 高于level中设置的级别,则打印日志 -->
<onMatch>ACCEPT</onMatch>
<!-- 低于level中设置的级别,则屏蔽日志 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 配置异步日志Appender -->
<appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="consoleAppender"/>
</appender>
<!--
日志记录器
配置root logger
level:配置日志级别
可以同时引入多个appender,做日志的多方向输出
-->
<root level="ALL">
<!-- 引入appender -->
<appender-ref ref="consoleAppender"/>
<!-- <appender-ref ref="fileAppender"/>-->
<!-- <appender-ref ref="htmlFileAppender"/>-->
<!-- <appender-ref ref="rollAppender"/>-->
<!-- <appender-ref ref="consoleFilterAppender"/>-->
<!-- <appender-ref ref="asyncAppender"/>-->
</root>
<!--
additivity="false"
表示不继承rootlogger
-->
<logger name="com.lsh" level="info" additivity="false">
<!-- 在自定义logger中配置appender -->
<appender-ref ref="consoleAppender"/>
</logger>
</configuration>
在配置文件中所有的配置都在根标签<configuration>下,其中配置了Appender以及日志记录器,Appender中包含了控制台输出、日志文件输出、html文件输出、拆分归档文件输出、异步日志输出,并且还包含了过滤器的配置和使用,以及Logback中日志记录器引入Appender的配置方式。
关于Logback的补充:
1.异步日志:
可配置属性:
<discardingThreshold>0</discardingThreshold>
<queueSize>256</queueSize>
discardingThreshold表示当队列剩余容量小于这个阈值的时候,那么当前日志的级别 trace、debug、info这3个级别的日志将被丢弃,设置为0,说明永远都不会丢弃trace、debug、info这3个级别的日志。
queueSize表示队列的深度,这个值会影响记录日志的性能,默认256
关于这两个属性,一般情况下,我们使用默认值即可,不要乱配置,会影响系统的性能,了解功能即可。
2.关于不同的日志实现,配置文件也不同
例如:
log4j经常使用的是properties属性文件
logback经常使用的是xml配置文件
如果我们遇到一种情况,就是需要将以前的Log4j,改造为使用Logback,应该如何处理
我们可以使用Logback官网提供的工具log4j.properties转换器
只有是二者兼容的技术,才会被翻译,如果是Log4j独有的技术,Logback没有,或者是有这个技术,但是并不兼容转义,那么这个工具不会为我们进行翻译,如果遇到简单的配置,我们可以使用工具进行翻译。
6.6总结
1.Logback日志框架实现了Slf4j的接口,因此可以与日志门面Slf4j完美衔接,在使用过程中,只需要引入Logback的日志框架依赖即可,无需通过其他组件进行适配。
2.相较于Log4j,Logback与其非常相似,但是在性能方面,Logback优于Log4j,并且Logback还具备了一些新的特性,例如过滤器、日志文件压缩等。
3.Logback的配置文件我们一般经常使用logback.xml,并且Logback的配置文件是默认自动加载的,因此无需我们对文件的加载进行配置,如果在我们没有对logback.xml或者logback-test.xml进行配置时,系统会使用默认配置进行日志的记录操作。