• java日志框架之Logback和Log4j2


    1、Logback

    1.1、Logback简介

    • Logback是由log4j创始人设计的又一个开源日志组件
    • Logback当前分成三个模块:logback-corelogback- classiclogback-access
    • logback-core是其它两个模块的基础模块,类似与springframework
    • logback-classic是log4j的一个改良版本。此外logback-classic完整实现SLF4J API。使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
    • logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能

    1.2、Logback中的组件

    • Logger:日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别
    • Appender:用于指定日志输出的目的地,目的地可以是控制台、文件、数据库等等
    • Layout:负责把事件转换成字符串,格式化的日志信息的输出。在Logback中Layout对象被封装在encoder中。也就是说我们未来使用的encoder其实就是Layout

    1.3、基础日志输出格式

    • %-10level 级别:案例为设置10个字符,左对齐
    • %d{yyyy-MM-dd HH:mm:ss.SSS}:日期
    • %c: 当前类全限定名
    • %M: 当前执行日志的方法
    • %L: 行号
    • %thread: 线程名称
    • %m或者%msg: 信息
    • %n: 换行

    1.4、入门使用

    基础使用

    依赖

    <!--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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    导包

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    • 1
    • 2
    • 日志级别:trace < debug < info < warn < error
    • 默认的日志级别是debug
    @Test
    public void test01(){
        Logger logger = LoggerFactory.getLogger(LOGBACKTest.class);
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果:logback默认输出格式

    11:21:36.810 [main] ERROR com.xc.mylog.LOGBACKTest - error信息
    11:21:36.812 [main] WARN com.xc.mylog.LOGBACKTest - warn信息
    11:21:36.812 [main] INFO com.xc.mylog.LOGBACKTest - info信息
    11:21:36.812 [main] DEBUG com.xc.mylog.LOGBACKTest - debug信息
    
    Process finished with exit code 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用logback.xml

    • 在resources下面,创建一份配置文件,命名为logback.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <!--通用格式配置-->
        <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"/>
        <!-- 配置文件的输出路径 -->
        <property name="logDir" value="D://test"/>
        
        <!-- 配置文件的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>
        
        <!-- 配置控制台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>
        <!--
            日志记录器
            配置root logger
            level:配置日志级别
            可以同时配置多个appender,做日志的多方向输出
        -->
        <root level="ALL">
            <!-- 引入控制台appender -->
            <appender-ref ref="consoleAppender"/>
            <!-- 引入普通文件appender -->
            <appender-ref ref="fileAppender"/>
        </root>
    </configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    @Test
    public void test02(){
        Logger logger = LoggerFactory.getLogger(LOGBACKTest.class);
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果:

    [ERROR] 2022-06-26 20:26:07.401 com.xc.mylog.LOGBACKTest test01 24 main error信息
    [WARN ] 2022-06-26 20:26:07.403 com.xc.mylog.LOGBACKTest test01 25 main warn信息
    [INFO ] 2022-06-26 20:26:07.404 com.xc.mylog.LOGBACKTest test01 26 main info信息
    [DEBUG] 2022-06-26 20:26:07.404 com.xc.mylog.LOGBACKTest test01 27 main debug信息
    [TRACE] 2022-06-26 20:26:07.404 com.xc.mylog.LOGBACKTest test01 28 main trace信息
    
    Process finished with exit code 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    执行两次查看文件输出内容:

    • 在文件中,默认是以追加日志的形式做记录

    在这里插入图片描述

    日志拆分和归档压缩

    logback.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <!--通用格式配置-->
        <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"/>
        <!-- 配置文件的输出路径 -->
        <property name="logDir" value="D://test"/>
    
        <!-- 配置文件的appender 可拆分归档的文件 -->
        <appender name="roll" 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>100KB</maxFileSize>
            </rollingPolicy>
        </appender>
        <!--
            日志记录器
            配置root logger
            level:配置日志级别
        -->
        <root level="ALL">
            <!-- 引入appender -->
            <appender-ref ref="roll"/>
        </root>
    </configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    @Test
    public void test03(){
        for (int i = 0; i < 1000; i++) {
            Logger logger = LoggerFactory.getLogger(LOGBACKTest.class);
            logger.error("error信息");
            logger.warn("warn信息");
            logger.info("info信息");
            logger.debug("debug信息");
            logger.trace("trace信息");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    26日,27日分别执行一次,文件拆分输出结果:

    在这里插入图片描述

    当前日志为roll_bogback.log,当日志文件超过100k或者切换日期则会压缩成日期格式gz

    日志进行更细粒度的打印控制

    logback.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <!--通用格式配置-->
        <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"/>
    
        <!-- 配置控制台的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>
        <!--
            日志记录器
            配置root logger
            level:配置日志级别
        -->
        <root level="ALL">
            <!-- 引入appender -->
            <appender-ref ref="consoleFilterAppender"/>
        </root>
    </configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    @Test
    public void test04(){
        Logger logger = LoggerFactory.getLogger(LOGBACKTest.class);
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果:

    [ERROR] 2022-06-26 22:43:54.133 com.xc.mylog.LOGBACKTest test06 148 main error信息
    
    Process finished with exit code 0
    
    • 1
    • 2
    • 3

    自定义logger

    additivity=“false” 表示不继承rootlogger

    <logger name="com.xc" level="info" additivity="false">
        <!-- 在自定义logger中配置appender -->
        <appender-ref ref="consoleAppender"/>
    </logger>
    
    • 1
    • 2
    • 3
    • 4

    1.5、异步日志

    • 原理:系统会为日志操作单独的分配出来一根线程,原来用来执行当前方法的主线程会继续向下执行
    • 线程1:系统业务代码执行,线程2:打印日志,两根线程争夺CPU的使用权
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <!--通用格式配置-->
        <property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L %thread %m%n"/>
        <!-- 配置控制台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 name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender">
            <appender-ref ref="consoleAppender"/>
        </appender>
        <!--日志记录器-->
        <root level="ALL">
            <appender-ref ref="asyncAppender"/>
        </root>
    </configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    @Test
    public void test05(){
        Logger logger = LoggerFactory.getLogger(LOGBACKTest.class);
        //日志打印操作
        for (int i = 0; i < 100; i++) {
            logger.error("error信息");
            logger.warn("warn信息");
            logger.info("info信息");
            logger.debug("debug信息");
            logger.trace("trace信息");
        }
        //系统本身业务相关的其他操作
        System.out.println("1----------------------");
        System.out.println("2----------------------");
        System.out.println("3----------------------");
        System.out.println("4----------------------");
        System.out.println("5----------------------");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    输出结果:日志和业务代码交替执行

    [ERROR] 2022-06-26 22:56:29.948 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.949 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息
    1----------------------
    [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息
    2----------------------
    3----------------------
    4----------------------
    5----------------------
    [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息
    [WARN ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main warn信息
    [INFO ] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main info信息
    [DEBUG] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main debug信息
    [TRACE] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main trace信息
    [ERROR] 2022-06-26 22:56:29.950 com.xc.mylog.LOGBACKTest ? ? main error信息
    
    Process finished with exit code 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103

    2、Log4j2

    2.1、Log4j2简介

    • Apache Log4j 2是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些问题
    • 被誉为是目前最优秀的Java日志框架

    2.2、Log4j2特征

    性能提升

    • Log4j2包含基于LMAX Disruptor库的下一代异步记录器
    • 在多线程场景中,异步记录器的吞吐量比Log4j 1.x和Logback高18倍,延迟低

    自动重新加载配置

    • 与Logback一样,Log4j2可以在修改时自动重新加载其配置
    • 与Logback不同,它会在重新配置发生时不会丢失日志事件

    高级过滤

    • 与Logback一样,Log4j2支持基于Log事件中的上下文数据,标记,正则表达式和其他组件进行过滤
    • 过滤器还可以与记录器关联。与Logback不同,Log4j2可以在任何这些情况下使用通用的Filter类

    无垃圾机制

    • 在稳态日志记录期间,Log4j2 在独立应用程序中是无垃圾的
    • 在Web应用程序中是低垃圾

    2.3、入门使用

    基础使用

    依赖

    <!-- log4j2日志门面 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.12.1</version>
    </dependency>
    <!-- log4j2日志实现 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.12.1</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    导包

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    • 1
    • 2
    • 单纯的使用Log4j2的 门面+实现
    • 默认为error级别信息的打印
    @Test
    public void test01(){
        Logger logger = LogManager.getLogger(Log4j2Test.class);
        logger.fatal("fatal信息");
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    输出结果:

    //警告
    //表示我们还没有建立自己的配置文件,如果没有建立配置文件,则使用默认的配置
    ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2
    20:32:32.558 [main] FATAL com.xc.mylog.Log4j2Test - fatal信息
    20:32:32.561 [main] ERROR com.xc.mylog.Log4j2Test - error信息
    
    Process finished with exit code 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    基础配置文件使用

    默认路径:resources/log4j2.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
        <!-- 配置appender -->
        <Appenders>
            <!-- 配置控制台输出 -->
            <Console name="consoleAppender" target="SYSTEM_OUT"/>
        </Appenders>
        <!-- 配置logger -->
        <Loggers>
            <!-- 配置rootlogger -->
            <Root level="trace">
                <!-- 引用Appender -->
                <AppenderRef ref="consoleAppender"/>
            </Root>
        </Loggers>
    </Configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • <Configuration status=“debug” monitorInterval=“数值”>
    • monitorInterval=“5” 自动加载配置文件的间隔时间,不低于5秒
    @Test
    public void test02(){
        Logger logger = LogManager.getLogger(Log4j2Test.class);
        logger.fatal("fatal信息");
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    输出结果:

    fatal信息
    error信息
    warn信息
    info信息
    debug信息
    trace信息
    
    Process finished with exit code 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.4、slf4j搭配log4j2使用

    当今市场上的最强大,最主流的日志使用搭配方式:slf4j+log4j2

    依赖

    <!-- slf4j日志门面 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    <!-- log4j适配器 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.12.1</version>
    </dependency>
    
    <!-- log4j2日志门面 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.12.1</version>
    </dependency>
    
    <!-- log4j2日志实现 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.12.1</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    导包

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    • 1
    • 2

    log4j2.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
        <!-- 配置appender -->
        <Appenders>
            <!-- 配置控制台输出 -->
            <Console name="consoleAppender" target="SYSTEM_OUT"/>
        </Appenders>
        <!-- 配置logger -->
        <Loggers>
            <!-- 配置rootlogger -->
            <Root level="trace">
                <!-- 引用Appender -->
                <AppenderRef ref="consoleAppender"/>
            </Root>
        </Loggers>
    </Configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • slf4j门面调用的是log4j2的门面,再由log4j2的门面调用log4j2的实现
    @Test
    public void test03(){
        Logger logger = LoggerFactory.getLogger(Log4j2Test.class);
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果:

    error信息
    warn信息
    info信息
    debug信息
    trace信息
    
    Process finished with exit code 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    日志拆分

    log4j2.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
        <!--配置全局通用属性-->
        <properties>
            <property name="logDir">D://test</property>
        </properties>
        <!-- 配置appender -->
        <Appenders>
            <!--
                按照指定规则来拆分日志文件
    
                fileName:日志文件的名字
                filePattern:日志文件拆分后文件的命名规则
                            $${date:yyyy-MM-dd}:根据日期当天,创建一个文件夹
                                        例如:2021-01-01这个文件夹中,记录当天的所有日志信息
                                        (拆分出来的日志放在这个文件夹中)
                                             2021-01-02这个文件夹中,记录当天的所有日志信息
                                             (拆分出来的日志放在这个文件夹中)
              rollog-%d{yyyy-MM-dd-HH-mm}-%i.log
                            为文件命名的规则:%i表示序号,从0开始,目的是为了让每一份文件名字不会重复
            -->
            <RollingFile name="rollingFile" fileName="${logDir}/rollog.log"
                            filePattern="${logDir}/$${date:yyyy-MM-dd}/rollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
                <!-- 日志消息格式 -->
                <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>
                <Policies>
                    <!-- 在系统启动时,触发拆分规则,产生一个日志文件 -->
                    <OnStartupTriggeringPolicy/>
                    <!-- 按照文件的大小进行拆分 -->
                    <SizeBasedTriggeringPolicy size="10KB"/>
                    <!-- 按照时间节点进行拆分 拆分规则就是filePattern-->
                    <TimeBasedTriggeringPolicy/>
                </Policies>
                <!-- 在同一目录下,文件的个数限制,如果超出了设置的数值,则根据时间进行覆盖,新的覆盖旧的规则-->
                <DefaultRolloverStrategy max="20"/>
            </RollingFile>
        </Appenders>
        <!-- 配置logger -->
        <Loggers>
            <!-- 配置rootlogger -->
            <Root level="trace">
                <!-- 引用Appender -->
                <AppenderRef ref="rollingFile"/>
                <AppenderRef ref="consoleAppender"/>
            </Root>
        </Loggers>
    </Configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    @Test
    public void test05(){
        Logger logger = LoggerFactory.getLogger(Log4j2Test.class);
        for (int i = 0; i < 2000; i++) {
            logger.error("error信息");
            logger.warn("warn信息");
            logger.info("info信息");
            logger.debug("debug信息");
            logger.trace("trace信息");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    输出文件结果:

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    【计算机网络】
    vatee万腾科技先锋之选:vatee创新力驱动着未来发展
    在springboot中如何开启Bean数据校验
    LeetCode 332. Reconstruct Itinerary【欧拉回路,通路,DFS】困难
    c++实现串口功能之termios.h头文件研读<二>
    DEM格式转换:转换NSDTF-DEM国标数据格式为通用格式,使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。
    vue使用ant design Vue中的a-select组件实现下拉分页加载数据
    Spring MVC拦截器
    HCIP实验3-1:IBGP与EBGP
    GCN笔记:Graph Convolution Neural Network,ChebNet
  • 原文地址:https://blog.csdn.net/qq_35512802/article/details/125467736