logback日志框架
一、Logback简介
Logback分为三个模块:logback-core,logback-classic,logback-access
logback-core是其他两个模块的基础模块。
logback-classic是log4j的改良版本,比log4j更强大。
二、Logback中的组件
Logger:日志的记录器,主要用于存放日志对象,也可以定义日志类型,级别等。
Appender:用于指定日志输出的目的地,比如你可以通过Appender指定日志输出到控制台,数据库,或者文件中。
Layout:这个组件就是用来格式化日志输出的,但是在logback中,Layout组件时被封装到了encoder组件中了,也就是说我们使用encoder时其实就是layout;
三、Logback的配置文件
Logback提供了三种配置文件:
1.logback.groovy
2.logback-test.xml
3.logback.xml
我们一般都是采用logback.xml作为配置文件,注意如果这三个配置文件都不存在时,logback就会采用默认的配置;
四、Logback的日志输出格式
五、依赖
注意:logback的依赖,一般都是搭配着slf4j-api,还有junit一起引入的;
<dependency>
//logback的日志门面依赖
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
//logback-classic模块中已经包含了logback-core模块
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
六、logback配置文件的书写
在resources目录下,新建logback.xml即可;
配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
配置文件通用属性
-->
<!--
日志输出格式的配置
-5表示左对齐(5就表示右对齐),level表示日志的级别;
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"></property>
<property name="pattern1" value="[%-5level]%d{yyyy-MM-dd HH:mm:ss.SSS}%c%M%L%thread%m%n"></property>
<!-- 配置日志文件的输出路径,也就是说你想把日志输入到文件中时,具体输出到哪里;然后name是随便取的,方便下面引用,value="D://test"表示将配置文件输出到D盘下的test文件夹中-->
<property name="logDir" value="D://test"></property>
<!--配置控制台的appender-->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<!--
target表示对于日志输出目标的配置
默认:System.out表示以黑色字体输出日志
System.err表示以红色字体输出日志
-->
<!--target中输入System.err后,就会以红色字体输出所有日志-->
<target>
System.err
</target>
<!--指定日志在控制台的输出格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 表示就用上面的property指定的格式"[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"输出日志 -->
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--配置‘普通文件’的appender,也就是将日志信息输出到普通的文件中-->
<appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
<!--
通过file标签引入文件的位置,也就是把上面property中指定的value="D://test"引入到fileAppender中;
${logDir}/logback.log这句话的意思就是:指定了日志文件的输出位置为"D://test/logback.log",也就是日志被记录在D盘下的test文件夹下的logback.log文件中
-->
<file>${logDir}/logback.log</file>
<!--指定日志在文件中的输出格式-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!--配置html文件的appender,因为logback可以将日志输出到html文件中,
我们需要用appender指定html的位置,这个html的样式是由logback自己进行维护的,
里面的内容,日志输出到html中的格式由我们自己指定;
-->
<appender name="htmlFileAppender" class="ch.qos.logback.core.FileAppender">
<!--这里你在指定html文件的位置时,你需要指定为html格式的文件,否则会出问题,毕竟是要以html格式输出-->
<file>{logDir}/logback.html</file>
<encoder class="ch.qos.logback.classic.encoder.LayoutWrappingEncoder">
<!--当你要输出日志到html文件中时,你要通过layout标签来指定"ch.qos.logback.classic.html.HTMLLayout"-->
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<!--这里表示还是以上面的"[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"格式输出日志到html文件中-->
<pattern>${pattern1}</pattern>
</layout>
</encoder>
</appender>
<!--(重要)
配置可以拆分的文件的appender,
也就是将日志输出到可拆分的文件中,
因为当你使用上面那种普通文件的记录方式时,所有日志信息都输出到同一个文件中,这个文件的到最后体积会非常大,不好管理,
所以我们可以配置,将日志输出到可拆分的文件中,什么意思呢?比如
-->
<appender name="roll" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
<charset>utf8</charset>
</encoder>
<!--引入文件的输出位置,也就是在${logDir}目录下生成一个roll_logback.log日志文件,
这个日志文件是没有拆分的,这一步是不能少的,roll_logback.log这个文件就相当于是一个母文件,
下面通过rollingPolicy标签指定的,生成的拆分出来的日志文件就是子文件,只有先有了母文件,才能有子文件
-->
<file>${logDir}/roll_logback.log</file>
<!--指定文件的拆分规则,SizeAndTime表示按照文件大小跟时间来拆分,比如日志文件保存多少天,保留多少G-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--
指定日志文件的压缩格式为gz(也可以指定为.zip), 注意:这里也要使用"${logDir}/",你要告诉系统,你要把日志文件输出到路径下。
同时在后面指定文件名,这里就是按照日期来生成文件名,也就是每天都生成一个日志文件,每个日志的文件名称中带有当天日期。
%i表示不同文件的标号,相当于文件与文件之间的区分,比如2022年9月22日当天生成的第一个日志文件满了50MB,
就会生成第二个日志文件roll.2022-9-22.log2.gz这样一个日志压缩文件,
当然第一个日志文件叫roll.2022-9-22.log1.gz,单词log后面的1跟2就是文件的标号,
因为同一天可能生成多个日志文件,要用标号做区分,否则文件会重名。
-->
<fileNamePattern>${logDir}/roll.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
<!--按照文件大小进行拆分,也就是说只要日志文件满了50MB,就会再生成第二个日志文件-->
<maxFileSize>50MB</maxFileSize>
<!--日志文件保留天数-->
<maxHistory>180</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
</appender>
<!--给appender配置过滤器,也就是给某个appender中加上过滤器,以便实现更细粒度的打印,
说的很高大上,其实很简单,比如我不想打印ERROR级别以下的日志,就是可以通过给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>
<!--给当前的appender配置过滤器-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--设置日志的输出级别-->
<level>ERROR</level>
<!--这里ACCEPT的意思表示:只要是高于level标签中设置的ERROR级别的日志,就打印,否则不打印-->
<onMatch>ACCEPT</onMatch>
<!--这里DENYT的意思表示:只要是低于level标签中设置的ERROR级别的日志,则屏蔽,也就是不打印出来-->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--(重要)
配置异步日志,
第一步:创建出一个异步appender——asyncAppender
第二步:在异步appender中,使用appender-ref标签引入你想要使用的appender,比如我现在想使用控制台appender,我就引入consoleAppender;
第二步:在最下面的root标签中,引入刚才创建好的异步appender——asyncAppender。
这样配置后,就能将控制台appender的日志打印跟业务逻辑代码并行执行,不会出现阻塞;如果你不配异步日志的话,日志打印跟业务逻辑之间是单线程在处理的,
效率较低,当你配置成异步日志后,就可以一边向控制台打印日志,或者向文件打印日志,一边执行业务逻辑;
-->
<appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="consoleAppender"/>
</appender>
<!--
root这里表示rootlogger;
level表示配置日志级别,All表示所有级别的日志都会被输出,如果你不配置为All,trace级别的日志是不会被输出的;
-->
<root level="All">
<!--
ref表示引入上面的定义好的appender,
上面定义好了两个appender,fileAppender表示将日志输出到文件中,consoleAppender表示将日志输出到控制台中,
当你在这里ref指定为fileAppender,日志就会输出到文件中,而不会输出到控制台;
当你在这里ref指定为consoleAppender,日志就会输出到控制台中,而不会输出到文件;
<appender-ref ref="fileAppender"/>
但是如果我在root标签中指定了两个appender-ref标签,那么我们就既可以在控制台输出日志,也可以在文件中输出日志了
<appender-ref ref="consoleAppender"/>
<appender-ref ref="htmlFileAppender"/>
-->
<appender-ref ref="asyncAppender"/>
</root>
<!--
自定义logger,说实话:我至今不知道自定义logger有什么用,但是这里还是把自定义logger的方法写出来了;
additivity="false"表示不继承rootlogger,因为我们要自定义logger,所以不继承rootlogger,
上面root标签就是logback自带的rootlogger,我们平时就是用的它
-->
<logger name="com.bjpowernode" level="info" additivity="false">
<!--同样,我们也可以自己自定义的logger中引入appender-->
<appender-ref ref="consoleAppender"/>
</logger>
</configuration>
七. 注意事项
线程池的队列中配置了一个阈值,当队列的剩余容量小于这个阈值时,日志的trace,debug,Info这三个几倍的日志将会被丢弃,我们这里要将discardingThreschold标签的值设置为0才不会默认丢弃;
<discardingThreschold>0</discardingThreschold>
配置队列的容量,默认是256
<queueSize>256</queueSize>
还要注意:discardingThreschold,queueSize这两个标签的值,就使用0跟256就好,不要自己乱配置,否则会影响记录日志的性能。