• SpringBoot中日志的使用log4j2


    SpringBoot中日志的使用log4j2

    1、log4j2介绍

    Apache Log4j2 是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了重大改进,并提供了 Logback 中可用的许多改

    进,同时修复了 Logback 架构中的一些问题,主要有:

    • 异常处理,在logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异常处理机

      制。

    • 性能提升,log4j2 相较于log4j 和 logback 都具有明显的性能提升,有18倍性能提升,后面会有官方测试的数

      据。

    • 自动重载配置,参考了logback的设计,当然会提供自动刷新参数配置,最实用的就是我们在生产上可以动态

      的修改日志的级别而不需要重启应用。

    • 无垃圾机制,log4j2 在大部分情况下,都可以使用其设计的一套无垃圾机制【对象重用、内存缓冲】,避免频

      繁的日志收集导致的 jvm gc。

    log4j、logback、log4j2都是一种日志具体实现框架,所以既可以单独使用也可以结合slf4j一起搭配使用。

    官网:https://logging.apache.org/log4j/2.x

    2、项目使用

    2.1 pom依赖

    springboot 默认使用的日志框架为 logback,要想使用 log4j2,需要从 spring-boot-starter-web 中排除对

    spring-boot-starter-logging 依赖。

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
        <exclusions>
            
            <exclusion>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-loggingartifactId>
            exclusion>
        exclusions>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    引入Log4j2依赖:

    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-log4j2artifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    spring-boot-starter-log4j2 的依赖关系:

    在这里插入图片描述

    上面的 log4j2 已经适配了 slf4j 日志门面,内部依赖了slf4j、log4j。

    SpringBoot 使用 log4j2 作为日志门面,但是最终也是通过 slf4j 调用 logback。

    完整的依赖:

    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0modelVersion>
        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.5.6version>
            <relativePath/>
        parent>
    
        <groupId>com.loggroupId>
        <artifactId>spring-boot-log4j2artifactId>
        <version>0.0.1-SNAPSHOTversion>
        <name>spring-boot-log4j2name>
        <description>spring-boot-log4j2description>
    
        <properties>
            <java.version>1.8java.version>
        properties>
    
        <dependencies>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
                <exclusions>
                    
                    <exclusion>
                        <groupId>org.springframework.bootgroupId>
                        <artifactId>spring-boot-starter-loggingartifactId>
                    exclusion>
                exclusions>
            dependency>
    
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
    
            
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-log4j2artifactId>
            dependency>
    
        dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                plugin>
            plugins>
        build>
    
    project>
    
    • 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

    2.2 log4j2配置

    创建log4j2.xml文件,放在工程resources目录里。这样就可以不加任何配置。如果你需要指定配置

    文件需要在Spring boot 配置文件application.yml中指定 logging.config 属性。

    下面是一份比较详细的 log4j2.xml 配置文件 :

    
    
    
    
    <configuration monitorInterval="5">
        
        
        <Properties>
            
            <property name="LOG_DIR">./logsproperty>
            
            <property name="HISTORY_LOG_DIR">./logs/historyproperty>
            
            <property name="FILE_NAME" value="log4j2"/>
            
            <property name="SPLIT_SIZE">100MBproperty>
            
            <property name="FILE_COUNT">30property>
            
            <property name="INTERVAL">30property>
            
            <property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} => [%thread] => %-5level %logger{50}:(%line) - %msg%n
            property>
        Properties>
    
        
        <appenders>
            
            <console name="Console" target="SYSTEM_OUT">
                
                
                <filters>
                    <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
                filters>
                
                <PatternLayout pattern="${LOG_PATTERN}"/>
            console>
    
            
            
            
            <File name="FileLog" fileName="${LOG_DIR}/test.log" append="false">
                <PatternLayout pattern="${LOG_PATTERN}"/>
            File>
    
            
            
            
            
            
            <RollingFile name="RollingFileDebug" fileName="${LOG_DIR}/debug.log"
                         filePattern="${HISTORY_LOG_DIR}/${FILE_NAME}-DEBUG-%d{yyyy-MM-dd}-%i.log.gz">
                
                
                
                <filters>
                    <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"/>
                    <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
                filters>
                <PatternLayout pattern="${LOG_PATTERN}"/>
                <Policies>
                    
                    <TimeBasedTriggeringPolicy interval="${INTERVAL}"/>
                    
                    <SizeBasedTriggeringPolicy size="${SPLIT_SIZE}"/>
                Policies>
                
                <DefaultRolloverStrategy max="${FILE_COUNT}"/>
            RollingFile>
    
            
            <RollingFile name="RollingFileInfo" fileName="${LOG_DIR}/info.log"
                         filePattern="${HISTORY_LOG_DIR}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}-%i.log.gz">
                
                
                <filters>
                    <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
                    <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
                filters>
                <PatternLayout pattern="${LOG_PATTERN}"/>
                <Policies>
                    
                    <TimeBasedTriggeringPolicy interval="${INTERVAL}"/>
                    
                    <SizeBasedTriggeringPolicy size="${SPLIT_SIZE}"/>
                Policies>
                
                <DefaultRolloverStrategy max="${FILE_COUNT}"/>
            RollingFile>
    
            
            <RollingFile name="RollingFileWarn" fileName="${LOG_DIR}/warn.log"
                         filePattern="${HISTORY_LOG_DIR}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}-%i.log.gz">
                
                
                <filters>
                    <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
                    <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
                filters>
                <PatternLayout pattern="${LOG_PATTERN}"/>
                <Policies>
                    
                    <TimeBasedTriggeringPolicy interval="${INTERVAL}"/>
                    
                    <SizeBasedTriggeringPolicy size="${SPLIT_SIZE}"/>
                Policies>
                
                <DefaultRolloverStrategy max="${FILE_COUNT}"/>
            RollingFile>
    
            
            <RollingFile name="RollingFileError" fileName="${LOG_DIR}/error.log"
                         filePattern="${HISTORY_LOG_DIR}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}-%i.log.gz">
                
                
                <filters>
                    <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
                filters>
                <PatternLayout pattern="${LOG_PATTERN}"/>
                <Policies>
                    
                    <TimeBasedTriggeringPolicy interval="${INTERVAL}"/>
                    
                    <SizeBasedTriggeringPolicy size="${SPLIT_SIZE}"/>
                Policies>
                
                <DefaultRolloverStrategy max="${FILE_COUNT}"/>
            RollingFile>
    
            
            <RollingFile name="ApiInfo" fileName="${LOG_DIR}/api.log"
                         filePattern="${HISTORY_LOG_DIR}/${FILE_NAME}-API-%d{yyyy-MM-dd}-%i.log.gz">
                <filters>
                    <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
                filters>
                <PatternLayout pattern="${LOG_PATTERN}"/>
                <Policies>
                    
                    <TimeBasedTriggeringPolicy interval="${INTERVAL}"/>
                    
                    <SizeBasedTriggeringPolicy size="${SPLIT_SIZE}"/>
                Policies>
                
                <DefaultRolloverStrategy max="${FILE_COUNT}"/>
            RollingFile>
    
            
            <Socket name="Logstash" host="127.0.0.1" port="4560" protocol="TCP">
                <PatternLayout pattern="${logPattern}"/>
            Socket>
    
        appenders>
    
        
        
        
        <loggers>
            
            
            
            
            
            
            
            <logger name="org.mybatis" level="info" additivity="false">
                <AppenderRef ref="Console"/>
            logger>
            
            
            <Logger name="org.springframework" level="info" additivity="false">
                <AppenderRef ref="Console"/>
            Logger>
    
            
            <root level="info">
                <appender-ref ref="Console"/>
                <appender-ref ref="FileLog"/>
                <appender-ref ref="RollingFileDebug"/>
                <appender-ref ref="RollingFileInfo"/>
                <appender-ref ref="RollingFileWarn"/>
                <appender-ref ref="RollingFileError"/>
            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
    • 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
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223

    基本上你拿上面的配置根据你自己的需要更改一下即可生效。

    注意 windows 下 ${sys:user.home} 会将日志打印到用户目录下。

    2.3 启动类

    package com.log;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SpringBootLogApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringBootLogApplication.class, args);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.4 测试

    package com.log;
    
    import com.log.controller.LogController;
    import org.junit.jupiter.api.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    public class SpringBootLogApplicationTests {
    
        /**
         * 声明日志记录器对象(slf4j包)
         */
        public static final Logger logger = LoggerFactory.getLogger(LogController.class);
    
        @Test
        void contextLoads() {
            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
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    执行输出:

    2023-11-19 10:46:45.238 => [main] => ERROR com.log.controller.LogController:(19) - error
    2023-11-19 10:46:45.250 => [main] => WARN  com.log.controller.LogController:(20) - warn
    2023-11-19 10:46:45.250 => [main] => INFO  com.log.controller.LogController:(21) - info
    
    • 1
    • 2
    • 3

    查看生成的文件:

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    由于设置了日志等级为info,所以debug不会有输出。

    2.5 使用@Slf4j注解输出日志

    lombok中的@Slf4j 注解可以很方便的使用 org.slf4j.Logger 对象。

    日常开发尽量使用Slf4j门面来处理日志,尽量避免使用具体的日志框架。

    引入依赖:

    
    <dependency>
        <groupId>org.projectlombokgroupId>
        <artifactId>lombokartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    编写controller:

    package com.log.controller;
    
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author tom
     */
    @Slf4j
    @RestController
    @RequestMapping("/logging")
    public class LogController {
    
        @GetMapping("/do")
        public String log() {
            log.error("error......");
            log.warn("warn......");
            log.info("info......");
            log.debug("debug......");
            log.trace("trace......");
            return "log4j2";
        }
    }
    
    • 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

    2.6 测试

    启动应用,访问http://localhost:8080/logging/do

    在这里插入图片描述

    在这里插入图片描述

    3、log4j2配置文件详解

    要想使 log4j2 配置生效,需要在 resources 目录下新建 log4j2.xml,springboot 会自动找到配置文件,并加载。

    3.1 日志级别

    log4j2共分8个日志级别,按从低到高排列为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF:

    ALL: 最低等级日志级别,输出所有日志
    TRACE: 追踪日志,如程序启动进程日志
    DEBUG: 程序调试信息
    INFO: 应用程序提示信息
    WARN: 告警信息
    ERROR: 程序报错信息
    FATAL: 程序出错,导致应用程序退出
    OFF: 关闭日志
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    设置应用程序的日志级别后,将输出该级别及以上的日志。如,设置日志级别为INFO,那么程序会输出INFO、

    WARN、ERROR及FATAL日志。

    3.2 monitorInterval

    监视配置文件变化间隔时间。如设置为30,表示每隔30s,程序会自动检测配置文件是否修改,如果修改,就更新

    配置文件。

    3.3 properties

    定义属性,方便在配置文件中引用。我们在这配置了 LOG_DIR、HISTORY_LOG_DIR、FILE_NAME、SPLIT_SIZE、

    FILE_COUNT、INTERVAL 及 LOG_PATTERN 属性。

    LOG_DIR: 日志输出目录
    HISTORY_LOG_DIR: 日志输出历史目录
    FILE_NAME: 日志文件的名字
    SPLIT_SIZE: 日志存档临界值,如果当天日志大于临界值,则存档,在这配置为100M
    FILE_COUNT: 存档文件个数,在这里配置为30,相当于保留最近30天的日志记录
    INTERVAL: 用来指定多久滚动一次
    LOG_PATTERN: 日志输出格式
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.4 appenders

    定义一系列的日志输出,可输出至控制台或者文件中。主要有三种日志输出方式:

    • Console:定义输出至控制台的方式;

    • File:定义输出至文件的方式;

    • RollingFile:定义输出至文件的方式,但会以一定的策略删除旧日志文件,并创建新的日志文件;

      三种方式有共同的子节点。

    3.4.1filters

    定义日志输出等级。

    如果想输出某个等级及其以上的日志,可做如下配置:

    <filters>
        <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />
    filters>
    
    • 1
    • 2
    • 3

    以上配置过滤INFO级别及其以上的日志。

    如果想单独输出某个等级的日志,可做如下配置:

    <filters>
        <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL" />
        <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY" />
    filters>
    
    • 1
    • 2
    • 3
    • 4

    以上配置只过滤DEBUG日志,INFO及其以上等级的日志将被拒绝。

    3.4.2 Console日志输出

    定义日志输出至控制台,主要属性有name、target、filters和PatternLayout。

    name: 自己定义
    target: 一般配置为SYSTEM_OUT,即将日志通过System.out输出
    filters: 定义日志输出等级,这里配置等级为INFO,即INFO及以上等级的日志输出到控制台
    PatternLayout: 定义日志输出格式
    
    • 1
    • 2
    • 3
    • 4
    3.4.3 File日志输出

    定义日志输出至文件,示例配置如下:

    <File name="fileLog" fileName="${logDir}/file.log" append="true">
        <filters>
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
        filters>
        <PatternLayout pattern="${logPattern}" />
    File>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    主要属性和子节点有name、fileName、append、filters和PatternLayout。

    • fileName:定义输出文件名;
    • append:当为true时,新增日志将被追加至文件末尾;如果为false,那么新日志将覆盖旧日志;
    3.4.4 RollingFile日志输出

    也是定义日志输出至文件,不同的是RollingFile可以定义日志文件存档策略。比如按照时间存档,每天备份一次,

    最大存档30天等等。

    
    <RollingFile name="RollingFileInfo" fileName="${LOG_DIR}/info.log"
                 filePattern="${HISTORY_LOG_DIR}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}-%i.log.gz">
        
        
        <filters>
            <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
        filters>
        <PatternLayout pattern="${LOG_PATTERN}"/>
        <Policies>
            
            <TimeBasedTriggeringPolicy interval="${INTERVAL}"/>
            
            <SizeBasedTriggeringPolicy size="${SPLIT_SIZE}"/>
        Policies>
        
        <DefaultRolloverStrategy max="${FILE_COUNT}"/>
    RollingFile>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    主要属性和子节点有name、fileName、filePattern、filters、PatternLayout、Policies、

    TimeBasedTriggeringPolicy、SizeBasedTriggeringPolicy 和 DefaultRolloverStrategy。

    fileName: 定义现在日志输出文件名
    filePattern: 定义历史日志文件名格式
    filters: 以上只输出debug日志
    Policies: 定义日志输出策略
    TimeBasedTriggeringPolicy: 指定多长时间触发日志备份策略这里默认为一天,还可以设置interval和modulate属性
    SizeBasedTriggeringPolicy: 指定日志文件多大时触发日志备份策略这里设置为100MB,即如果当天日志一次超过100MB备份为DEBUG-2023-05-02-1.log;如果再次超过100MB则备份为DEBUG-2023-05-02-2.log
    DefaultRolloverStrategy: 设置日志文档存档个数max指定能保存的文件个数,超过后之前的文件将被删除
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    3.4.5 Socket日志输出

    定义日志输出至数据库或者其它日志管理系统,如elk等。

    
    <Socket name="Logstash" host="127.0.0.1" port="4560" protocol="TCP">
        <PatternLayout pattern="${logPattern}"/>
    Socket>
    
    • 1
    • 2
    • 3
    • 4

    以上定义日志输出至127.0.0.1:4560服务器,也就是我本地创建的elk日志管理系统。

    3.5 loggers

    所有在 appenders 里定义的 appender 都需要在 logger 下引用,否则 appender 的配置就不会生效。

    如果要过滤掉一些 debug 信息,可以在 logger 中屏蔽掉,如下屏蔽掉 org.mybatis 中 info 级别以下的日志:

    <logger name="org.mybatis" level="info" additivity="false">
        <AppenderRef ref="Console"/>
    logger>
    
    • 1
    • 2
    • 3

    设置项目中的日志输出至指定的文件,并且在控制台中输出,配置如下:

    <logger name="com.log.controller" level="DEBUG" additivity="true">
        <appender-ref ref="RollingFileDebug"/>
        <appender-ref ref="RollingFileInfo"/>
        <appender-ref ref="RollingFileWarn"/>
        <appender-ref ref="RollingFileError"/>
        <appender-ref ref="Console"/>
        <appender-ref ref="FileLog"/>
    logger>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    root 节点为兜底操作,所有在 appenders 中配置的,但没有在其它 logger 中输出的,都会在 root 的 logger 中

    输出。

    <root level="info">
        <appender-ref ref="Console"/>
        <appender-ref ref="FileLog"/>
        <appender-ref ref="RollingFileDebug"/>
        <appender-ref ref="RollingFileInfo"/>
        <appender-ref ref="RollingFileWarn"/>
        <appender-ref ref="RollingFileError"/>
    root>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4、log4j与log4j2的不同配置

    log4j与log4j2的配置文件中的属性有所不同,具体请参考:

    https://logging.apache.org/log4j/2.x/manual/migration.html

    5、log4j2的其它功能

    5.1 占位符

    使用{}占位符格式化参数。

    package com.log;
    
    import com.log.controller.LogController;
    import org.apache.logging.log4j.LogManager;
    import org.junit.jupiter.api.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    public class SpringBootLogApplicationTests1 {
    
        /**
         * 声明日志记录器对象(slf4j包)
         */
        public static final Logger logger = LoggerFactory.getLogger(LogController.class);
    
        @Test
        void contextLoads() {
            String param="springboot 课程";
            logger.info("请求参数:{},结果:{}",param,"hello slf4j");
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    输出:

    2023-11-19 14:36:44.293 => [main] => INFO  com.log.controller.LogController:(21) - 请求参数:springboot 课程,结果:hello slf4j
    
    • 1

    5.2 String.format的形式格式化参数

    log4j2 中除了支持{}的参数占位符,还支持String.format的形式。

    注意,如果想使用String.format的形式,需要使用LogManager.getFormatterLogger

    package com.log;
    
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    public class SpringBootLogApplicationTests2 {
    
        // 使用的是org.apache.logging.log4j包
        public static Logger formatterLogger = LogManager.getFormatterLogger(SpringBootLogApplicationTests2.class);
    
        @Test
        void contextLoads() {
            formatterLogger.info("Integer.MAX_VALUE = %d", Integer.MAX_VALUE);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    输出:

    2023-11-19 14:40:55.730 => [main] => INFO  MyLogger:(15) - Integer.MAX_VALUE = 2147483647
    
    • 1

    5.3 使用logger.printf格式化参数

    log4j2 的 Logger 接口中,还有一个 printf 方法,无需创建LogManager.getFormatterLogger,就可以使用

    String.format的形式。

    package com.log;
    
    import org.apache.logging.log4j.Level;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    public class SpringBootLogApplicationTests3 {
    
        // 使用的是org.apache.logging.log4j包
        public static Logger logger = LogManager.getLogger(SpringBootLogApplicationTests3.class);
    
        @Test
        void contextLoads() {
            logger.printf(Level.INFO, "Integer.MAX_VALUE = %d", Integer.MAX_VALUE);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    输出:

    2023-11-19 14:46:17.133 => [main] => INFO  MyLogger:(18) - Integer.MAX_VALUE = 2147483647
    
    • 1

    5.4 惰性打日志(lazy logging)

    package com.log;
    
    import com.log.controller.LogController;
    import org.junit.jupiter.api.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    public class SpringBootLogApplicationTests4 {
    
        /**
         * 声明日志记录器对象(slf4j包)
         */
        public static final Logger logger = LoggerFactory.getLogger(LogController.class);
    
        @Test
        void contextLoads() {
            if (logger.isInfoEnabled()) {
                String param = "springboot 课程";
                logger.info("请求参数:{},结果:{}", param, "hello slf4j");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    输出:

    2023-11-19 14:49:30.652 => [main] => INFO  com.log.controller.LogController:(21) - 请求参数:springboot 课程,结果:hello slf4j
    
    • 1
  • 相关阅读:
    Python实现的桌面翻译程序代码
    数据库管理-第210期 HaloDB-Oracle兼容性测试02(20240622)
    DNA 11. 识别肿瘤蛋白质三维结构上突变热点(HotSpot3D)
    NestJS代码片段解读(1)
    1.1入门指南(AutoMapper官方文档翻译)
    SqlServer 提供的数据迁移方案
    window下VS2022封装动态库以及调用动态库
    Vue2技能树(3)-声明式渲染、指令大全、生命周期函数
    Instagram 早期技术架构
    安卓APP源码和设计报告——好再来点餐
  • 原文地址:https://blog.csdn.net/qq_30614345/article/details/134492204