Logback 的过滤器和异步日志和自定义 logger
跳到导航
跳到搜索
https://www.bilibili.com/video/BV1iJ411H74S?p=30
示例 使用过滤器
logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--
配置集中管理属性
可以直接该属性的 value 值
格式:${name}
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>
<!--
日志输出格式:
%-5level 日志级别
%d{yyyy-MM-dd HH:mm:ss.SSS} 时间
%c 类的全限定名
%M 方法名
%L 行号
%thread 线程名称
%m 或者 %msg 为信息
%n 换行
-->
<!-- 定义日志文件保存路径属性 -->
<property name="log_dir" value="/logs"></property>
<!-- 控制台日志输出的 appender -->
<appender name="console" 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="file" class="ch.qos.logback.core.FileAppender">
<!-- 日志文件的保存路径 -->
<file>${log_dir}/logback.log</file>
<!-- 日志消息格式配置 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- HTML 格式日志文件输出 -->
<appender name="htmlFile" class="ch.qos.logback.core.FileAppender">
<!-- 日志文件的保存路径 -->
<file>${log_dir}/logback.html</file>
<!-- HTML 消息格式配置 -->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>%-5level%d{yyyy-MM-dd HH:mm:ss.SSS}%c%M%L%thread%m</pattern>
</layout>
</encoder>
</appender>
<!-- 日志拆分和归档压缩的 appender 对象 -->
<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志文件的保存路径 -->
<file>${log_dir}/rolling_logback.log</file>
<!-- 日志消息格式配置 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!-- 指定拆分规则 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 按照时间和压缩格式声明拆分的文件名 -->
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd HH-mm-ss}.log%i.gz</fileNamePattern>
<!-- 按照文件大小拆分 -->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
<!-- 日志级别过滤器-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 日志过滤规则 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- root logger 配置 -->
<root level="ALL">
<appender-ref ref="console"/>
<!-- <appender-ref ref="file"/>-->
<!-- <appender-ref ref="htmlFile"/>-->
<appender-ref ref="rollingFile"/>
</root>
</configuration>
LogbackTest.java
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackTest {
public static final Logger LOGGER = LoggerFactory.getLogger(LogbackTest.class);
// 快速入门
@Test
public void test() {
for (int i = 0; i < 10000; i++) {
// 日志输出
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.info("info");
LOGGER.debug("debug");
LOGGER.trace("trace");
}
}
}
观察控制台和滚动日志文件中的输出内容:
控制台中仍然输出所有日志级别的日志;
滚动日志文件中就只有 ERROR 级别的日志了,这是因为为 rollingFile appender 配置了日志级别过滤器:
<!-- 日志级别过滤器-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 日志过滤规则 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
只有日志级别大于 ERROR 的日志 rollingFile appender 才会记录到滚动日志文件中
示例 使用异步日志
logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--
配置集中管理属性
可以直接该属性的 value 值
格式:${name}
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>
<!--
日志输出格式:
%-5level 日志级别
%d{yyyy-MM-dd HH:mm:ss.SSS} 时间
%c 类的全限定名
%M 方法名
%L 行号
%thread 线程名称
%m 或者 %msg 为信息
%n 换行
-->
<!-- 定义日志文件保存路径属性 -->
<property name="log_dir" value="/logs"></property>
<!-- 控制台日志输出的 appender -->
<appender name="console" 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="file" class="ch.qos.logback.core.FileAppender">
<!-- 日志文件的保存路径 -->
<file>${log_dir}/logback.log</file>
<!-- 日志消息格式配置 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- HTML 格式日志文件输出 -->
<appender name="htmlFile" class="ch.qos.logback.core.FileAppender">
<!-- 日志文件的保存路径 -->
<file>${log_dir}/logback.html</file>
<!-- HTML 消息格式配置 -->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>%-5level%d{yyyy-MM-dd HH:mm:ss.SSS}%c%M%L%thread%m</pattern>
</layout>
</encoder>
</appender>
<!-- 日志拆分和归档压缩的 appender 对象 -->
<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志文件的保存路径 -->
<file>${log_dir}/rolling_logback.log</file>
<!-- 日志消息格式配置 -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!-- 指定拆分规则 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 按照时间和压缩格式声明拆分的文件名 -->
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd HH-mm-ss}.log%i.gz</fileNamePattern>
<!-- 按照文件大小拆分 -->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
<!-- 日志级别过滤器-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 日志过滤规则 -->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 异步日志 -->
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
<!--指定某个具体的 appender-->
<appender-ref ref="rollingFile"/>
</appender>
<!-- root logger 配置 -->
<root level="ALL">
<appender-ref ref="console"/>
<!-- <appender-ref ref="file"/>-->
<!-- <appender-ref ref="htmlFile"/>-->
<!-- <appender-ref ref="rollingFile"/>-->
<appender-ref ref="async"/>
</root>
</configuration>
输出不变,但是异步记录日志效率上优化很多,尤其是在生产环境中,关键配置是
<!-- 异步日志 -->
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
<!--指定某个具体的 appender-->
<appender-ref ref="rollingFile"/>
</appender>
<!-- root logger 配置 -->
<root level="ALL">
<appender-ref ref="async"/>
</root>
指定了异步记录 rollingFile appender
示例 使用自定义 logger
logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
……
<!-- root logger 配置 -->
<root level="ALL">
<appender-ref ref="console"/>
<appender-ref ref="async"/>
</root>
<!-- 自定义 logger 对象
additivity="false" 自定义 logger 对象是否继承 rootLogger
-->
<logger name="io.github.jihch" level="info" additivity="false">
<appender-ref ref="console"/>
</logger>
</configuration>
LogbackTest.java
不变
控制台只会输出 INFO 级别和 INFO 级别以上的日志,因为增加了 name=“io.github.jihch”的 logger,所以 io.github.jihch.LogbackTest 中使用的就是这个 logger,
而这个 logger 配置了只记录 INFO 级别和 INFO 级别以上的日志;
且 additivity="false",不继承、使用 rootLogger 中的 console 和 async appender,只使用自己配置中的 console appender,所以就只有控制台中有日志记录,
/logs/ 目录下不再记录任何日志内容