Home  >  Article  >  Java  >  How SpringBoot 2.x integrates Log4j2 logs

How SpringBoot 2.x integrates Log4j2 logs

WBOY
WBOYforward
2023-05-30 18:43:241226browse

    Integration steps

    The springboot version used in this demonstration is 2.7.x.

    • Dependency introduction

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    • Need to exclude the dependency of the logback logging framework spring-boot-starter-logging

    • Introducing log4j2 dependenciesspring-boot-starter-log4j2

    • Add log4j2 configuration file

    • Add log4j2-spring.xml to classpath Or log4j2.xml file, it is recommended to use log4j-spring.xml, in this way spring can control the initialization.

    • If you don’t want to put the configuration on the classpath and need to customize the location, you can pass the configuration item logging.config: ./log4j2.xml in the configuration file. to modify.

    How SpringBoot 2.x integrates Log4j2 logs

    • Add log file content

    below Through the most streamlined configuration content, the next section explains the configuration in detail.

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration monitorInterval="5">
        <!--变量配置-->
        <Properties>
            <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
            <!-- %logger{36} 表示 Logger 名字最长36个字符 -->
            <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
            <!-- 定义日志存储的路径 -->
            <property name="FILE_PATH" value="./logs"/>
            <property name="FILE_NAME" value="log4j2Demo"/>
        </Properties>
    
        <appenders>
            <Console name="Console" target="SYSTEM_OUT">
                <!--设置日志格式及颜色-->
                <PatternLayout
                        pattern="%style{%d{ISO8601}}{bright,green} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C{}}{bright,yellow}: %msg%n%style{%throwable}{red}"
                        disableAnsi="false" noConsoleNoAnsi="false"/>
            </Console>
    
            <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
            <File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
                <PatternLayout pattern="${LOG_PATTERN}"/>
            </File>
    
            <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
            <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log"
                         filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
                <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout pattern="${LOG_PATTERN}"/>
                <Policies>
                    <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                    <TimeBasedTriggeringPolicy interval="1"/>
                    <SizeBasedTriggeringPolicy size="10MB"/>
                </Policies>
                <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
                <DefaultRolloverStrategy max="15"/>
            </RollingFile>
    
            <!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
            <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log"
                         filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
                <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout pattern="${LOG_PATTERN}"/>
                <Policies>
                    <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                    <TimeBasedTriggeringPolicy interval="1"/>
                    <SizeBasedTriggeringPolicy size="10MB"/>
                </Policies>
                <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
                <DefaultRolloverStrategy max="15"/>
            </RollingFile>
    
            <!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
            <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log"
                         filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
                <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
                <PatternLayout pattern="${LOG_PATTERN}"/>
                <Policies>
                    <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                    <TimeBasedTriggeringPolicy interval="1"/>
                    <SizeBasedTriggeringPolicy size="10MB"/>
                </Policies>
                <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
                <DefaultRolloverStrategy max="15"/>
            </RollingFile>
    
        </appenders>
    
        <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
        <!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
        <loggers>
            <root level="info">
                <appender-ref ref="Console"/>
                <appender-ref ref="Filelog"/>
                <appender-ref ref="RollingFileInfo"/>
                <appender-ref ref="RollingFileWarn"/>
                <appender-ref ref="RollingFileError"/>
            </root>
        </loggers>
    
    </configuration>
    • Add test code

    How SpringBoot 2.x integrates Log4j2 logs

    • #View results

    How SpringBoot 2.x integrates Log4j2 logs

    Log4j2 configuration details

    log4j2 log level from low to high, as follows:

    ● Trace: Tracing is to advance the program, you can write a trace output

    ● Debug: Debugging, generally as the lowest level, trace is basically not used.

    ● info: Output important information, often used

    ● warn: Warning, some information is not error information, but it should also give the programmer some tips.

    ● error: error message. Used a lot.

    ● fatal: fatal error.

    If the level of a log message is greater than or equal to the level of the configuration file, it will be recorded.

    The configuration file template is as follows:

    <?xml version="1.0" encoding="UTF-8"?>
    <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
    <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
    <configuration monitorInterval="5">
      <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
    
      <!--变量配置-->
      <Properties>
        <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
        <!-- %logger{36} 表示 Logger 名字最长36个字符 -->
        <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
        <!-- 定义日志存储的路径 -->
        <property name="FILE_PATH" value="更换为你的日志路径" />
        <property name="FILE_NAME" value="更换为你的项目名" />
      </Properties>
    
      <appenders>
    
        <console name="Console" target="SYSTEM_OUT">
          <!--输出日志的格式-->
         <PatternLayout
                        pattern="%style{%d{ISO8601}}{bright,green} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C{}}{bright,yellow}: %msg%n%style{%throwable}{red}"
                        disableAnsi="false" noConsoleNoAnsi="false"/>
          <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
          <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
        </console>
    
        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
        <File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
          <PatternLayout pattern="${LOG_PATTERN}"/>
        </File>
    
        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
          <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
          <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
          <PatternLayout pattern="${LOG_PATTERN}"/>
          <Policies>
            <!--interval属性用来指定多久滚动一次,默认是1 hour-->
            <TimeBasedTriggeringPolicy interval="1"/>
            <SizeBasedTriggeringPolicy size="10MB"/>
          </Policies>
          <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
          <DefaultRolloverStrategy max="15"/>
        </RollingFile>
    
        <!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
          <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
          <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
          <PatternLayout pattern="${LOG_PATTERN}"/>
          <Policies>
            <!--interval属性用来指定多久滚动一次,默认是1 hour-->
            <TimeBasedTriggeringPolicy interval="1"/>
            <SizeBasedTriggeringPolicy size="10MB"/>
          </Policies>
          <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
          <DefaultRolloverStrategy max="15"/>
        </RollingFile>
    
        <!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
          <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
          <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
          <PatternLayout pattern="${LOG_PATTERN}"/>
          <Policies>
            <!--interval属性用来指定多久滚动一次,默认是1 hour-->
            <TimeBasedTriggeringPolicy interval="1"/>
            <SizeBasedTriggeringPolicy size="10MB"/>
          </Policies>
          <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
          <DefaultRolloverStrategy max="15"/>
        </RollingFile>
    
      </appenders>
    
      <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
      <!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
      <loggers>
    
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.mybatis" level="info" additivity="false">
          <AppenderRef ref="Console"/>
        </logger>
        <!--监控系统信息-->
        <!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
        <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="RollingFileInfo"/>
          <appender-ref ref="RollingFileWarn"/>
          <appender-ref ref="RollingFileError"/>
        </root>
      </loggers>
    
    </configuration>

    Root node configuration

    • The attribute status is used to specify the print log of log4j itself Level.

    • The attribute monitorinterval is used to specify the monitoring interval for log4j automatic reconfiguration. The unit is s, and the minimum is 5s.

    Subnode Properties

    Configure global variables, which can be referenced through ${xxx}

    Sub-node Appenders

    There are three common Appenders: Console, RollingFile, and File.

    The Console node is used to define the Appender output to the console.

    • name: Specify the name of the Appender.

    • Usually the default is only set to SYSTEM_OUT, not SYSTEM_ERR

    • PatternLayout: Output format, if not set, the default is: %m%n.

    The File node is used to define the Appender that outputs the file to the specified location.

    • name: Specifies the name of the Appender.

    • fileName: Specify the file name with the full path of the destination file for the output log.

    • PatternLayout: Output format, if not set, the default is: %m%n.

    RollingFile node is used to define automatic deletion of old ones and creation of new Appenders when specified conditions are exceeded.

    • name: Specify the name of the Appender .

    • fileName: Specify the file name with the full path of the destination file for the output log.

    • PatternLayout: Output format, if not set, the default is: %m%n.

    • filePattern: Specify the file transfer and renaming rules when Rolling occurs.

    • Policies: Specify the rolling log The policy is when to create a new log file and output the log.

    • TimeBasedTriggeringPolicy:Policies sub-node, a time-based rolling strategy, the interval attribute is used to specify how often to scroll, the default is 1 hour . modulate=true is used to adjust the time: for example, it is 3am in the morning, and the interval is 4, then the first scroll is at 4am, then 8am, 12am... instead of 7am.

    • SizeBasedTriggeringPolicy:Policies subnode, based on the rolling strategy of the specified file size, the size attribute is used to define the size of each log file.

    • DefaultRolloverStrategy: used to specify the maximum number of files in the same folder When there are several log files start deleting the oldest and creating new ones (via max attribute).

    Subnode Loggers

    There are two common types: root and logger. Root is actually a special logger. If no logger is specified separately, the root log node will be used to determine the root log of the project and output that root log by default.

    • Attribute level: Log output level

    • Attribute appenderRef is used to specify which Appender the log is output to.

    • The logger node is used to specify the log form individually, for example, to specify different log levels for classes under a specified package.

    • The attribute name under the logger node is used to specify the class that the Logger is applicable to or the full path of the package where the class is located, and is inherited from the root node.

    • The attribute appenderRef under the logger node is used to specify which Appender the log is output to. If not specified, it will be inherited from root by default. If specified, it will be output in both the specified appender and the root appender. At this time, we can set the Logger's additivity="false" to only output in the custom appender.

    The above is the detailed content of How SpringBoot 2.x integrates Log4j2 logs. For more information, please follow other related articles on the PHP Chinese website!

    Statement:
    This article is reproduced at:yisu.com. If there is any infringement, please contact admin@php.cn delete