“Logback 的过滤器和异步日志和自定义 logger”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
第131行: 第131行:
 
         </filter>
 
         </filter>
 
</syntaxhighlight>只有日志级别大于 ERROR 的日志 rollingFile appender 才会记录到滚动日志文件中
 
</syntaxhighlight>只有日志级别大于 ERROR 的日志 rollingFile appender 才会记录到滚动日志文件中
 +
 +
 +
 +
 +
 +
=== 示例 使用异步日志 ===
 +
 +
==== logback.xml ====
 +
<syntaxhighlight lang="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>
 +
</syntaxhighlight>输出不变,但是异步记录日志效率上优化很多,尤其是在生产环境中,关键配置是<syntaxhighlight lang="xml">
 +
    <!-- 异步日志 -->
 +
    <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>
 +
</syntaxhighlight>指定了异步记录 rollingFile appender

2023年2月27日 (一) 11:19的版本

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