SpringBoot系列(12):SpringBoot集成log4j2日志配置

最近项目上有使用到log4j2日志模板配置,本文简单总结一下之前的学习笔记,如有纰漏之处,请批评指正。

1. log4j2日志依赖

使用log4j2日志模板时,需要引入相关依赖,下边的两种依赖方式均可。

1.1 使用sl4j依赖时

    <properties>
        <spring-boot.version>2.6.13</spring-boot.version>
        <log4j2.version>2.18.0</log4j2.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring-boot.version}</version>
        </dependency>

        <!-- log4j2 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>${log4j2.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


  • 使用sl4j依赖时,需要在打印日志的类中声明一个日志对象处理
private static  final Logger LOGGER = LoggerFactory.getLogger(xxxxxx.class);

// 方法内
LOGGER .info("application started");

 这种方式需要配置很多次,略繁琐。可以类上使用注解@sl4j来代替

1.2 使用lombok依赖时

如果不想像上边那样写一堆sl4f依赖,可以直接使用lombok依赖,作用是相同的。仅仅在需要打印日志的类上配置上注解@sl4j即可。

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
  • 在需要打印日志的方法内直接使用
// 方法内
log.info("application started");

 1.3 小结

上边两种配置方式,原理雷同,看实际项目需要和个人喜好使用即可。


2. log4j2.xml日志模板配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">

    <properties>
        <!-- 日志打印级别 -->
        <property name="LOG_LEVEL">INFO</property>
        <!-- APP名称 -->
        <property name="APP_NAME" value="spring-mvc-log"/>
        <!-- 日志文件存储路径 -->
        <property name="LOG_HOME">./logs</property>
        <!-- 存储天数 -->
        <property name="LOG_MAX_HISTORY" value="10d"/>
        <!-- 单个日志文件最大值, 单位 = KB, MB, GB -->
        <property name="LOG_MAX_FILE_SIZE" value="10 MB"/>
        <!-- 每天每个日志级别产生的文件最大数量 -->
        <property name="LOG_TOTAL_NUMBER_DAILY" value="10"/>
        <!-- 压缩文件的类型,支持zip和gz,建议Linux用gz,Windows用zip -->
        <property name="ARCHIVE_FILE_SUFFIX" value="zip"/>
        <!-- 日志文件名 -->
        <property name="LOG_FILE_NAME" value="${LOG_HOME}/${APP_NAME}"/>
        <property name="FILE_NAME_PATTERN" value="${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}"/>

        <!-- %d: 日期
        %-5level: 日志级别,显示时占5个字符不足
        [%t]: 线程名
        %c{1.}: 显示调用者,只显示包名最后一截及方法名,前面的只取首字母
        .%M(代码行号%L):
        %msg%n": 需要打印的日志信息,换行:INFO>[MsgToMP:99]
        Bright: 加粗 -->
        <!--日志输出格式-控制台彩色打印-->
        <property name="ENCODER_PATTERN_CONSOLE">%blue{%d{yyyy-MM-dd HH:mm:ss.SSS}} | %highlight{%-5level}{ERROR=Bright RED, WARN=Bright Yellow, INFO=Bright Green, DEBUG=Bright Cyan, TRACE=Bright White} | %yellow{%t} | %cyan{%l} >>>>> %white{%msg%n}</property>
        <!--日志输出格式-文件-->
        <property name="ENCODER_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} | %-5level | %t | %c{1.} >>>>> %msg%n</property>
    </properties>

    <Appenders>
        <!-- 控制台的输出配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="${ENCODER_PATTERN_CONSOLE}" />
        </Console>
        <!-- 打印出所有的info及以下级别的信息,每次大小超过size进行压缩,作为存档-->
        <RollingFile name="RollingFileAll" fileName="${LOG_FILE_NAME}.ALL.log" filePattern="${FILE_NAME_PATTERN}.ALL.%i.log.${ARCHIVE_FILE_SUFFIX}">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="${LOG_LEVEL}" onMatch="ACCEPT" onMismatch="DENY" />
            <!--输出日志的格式-->
            <PatternLayout pattern="${ENCODER_PATTERN}" />
            <Policies>
                <!-- 归档每天的文件 -->
                <TimeBasedTriggeringPolicy />
                <!-- 限制单个文件大小 -->
                <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}" />
            </Policies>
            <!-- 限制每天文件个数 -->
            <DefaultRolloverStrategy compressionLevel="9" max="${LOG_TOTAL_NUMBER_DAILY}">
                <Delete basePath="${LOG_HOME}" maxDepth="1">
                    <IfFileName glob="${APP_NAME}.*.ALL.*.log.${ARCHIVE_FILE_SUFFIX}" />
                    <IfLastModified age="${LOG_MAX_HISTORY}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="RollingFileDebug"
                     fileName="${LOG_FILE_NAME}.DEBUG.log"
                     filePattern="${FILE_NAME_PATTERN}.DEBUG.%i.log.${ARCHIVE_FILE_SUFFIX}">
            <Filters>
                <ThresholdFilter level="DEBUG" />
                <ThresholdFilter level="INFO" onMatch="DENY"
                                 onMismatch="NEUTRAL" />
            </Filters>
            <PatternLayout pattern="${ENCODER_PATTERN}" />
            <Policies>
                <!-- 归档每天的文件 -->
                <TimeBasedTriggeringPolicy />
                <!-- 限制单个文件大小 -->
                <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}" />
            </Policies>
            <!-- 限制每天文件个数 -->
            <DefaultRolloverStrategy compressionLevel="9"
                                     max="${LOG_TOTAL_NUMBER_DAILY}">
                <Delete basePath="${LOG_HOME}" maxDepth="1">
                    <IfFileName glob="${APP_NAME}.*.DEBUG.*.log.${ARCHIVE_FILE_SUFFIX}" />
                    <IfLastModified age="${LOG_MAX_HISTORY}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="RollingFileWarn" fileName="${LOG_FILE_NAME}.WARN.log"
                     filePattern="${FILE_NAME_PATTERN}.WARN.%i.log.${ARCHIVE_FILE_SUFFIX}">
            <Filters>
                <ThresholdFilter level="WARN" />
                <ThresholdFilter level="ERROR" onMatch="DENY"
                                 onMismatch="NEUTRAL" />
            </Filters>
            <PatternLayout pattern="${ENCODER_PATTERN}" />
            <Policies>
                <!-- 归档每天的文件 -->
                <TimeBasedTriggeringPolicy />
                <!-- 限制单个文件大小 -->
                <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}" />
            </Policies>
            <!-- 限制每天文件个数 -->
            <DefaultRolloverStrategy compressionLevel="9"
                                     max="${LOG_TOTAL_NUMBER_DAILY}">
                <Delete basePath="${LOG_HOME}" maxDepth="1">
                    <IfFileName glob="${APP_NAME}.*.WARN.*.log.${ARCHIVE_FILE_SUFFIX}" />
                    <IfLastModified age="${LOG_MAX_HISTORY}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="RollingFileError"
                     fileName="${LOG_FILE_NAME}.ERROR.log"
                     filePattern="${FILE_NAME_PATTERN}.ERROR.%i.log.${ARCHIVE_FILE_SUFFIX}">
            <Filters>
                <ThresholdFilter level="ERROR" />
            </Filters>
            <PatternLayout pattern="${ENCODER_PATTERN}" />
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="${LOG_MAX_FILE_SIZE}" />
            </Policies>
            <DefaultRolloverStrategy compressionLevel="9"   max="${LOG_TOTAL_NUMBER_DAILY}">
                <Delete basePath="${LOG_HOME}" maxDepth="1">
                    <IfFileName glob="${APP_NAME}.*.ERROR.*.log.${ARCHIVE_FILE_SUFFIX}" />
                    <IfLastModified age="${LOG_MAX_HISTORY}" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>

    <!--只有定义了logger并引入以上Appenders,Appender才会生效-->
    <Loggers>
        <root level="${LOG_LEVEL}">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileAll"/>
            <appender-ref ref="RollingFileDebug"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </Loggers>
</configuration>

3. 开启Console彩色打印

  • 彩色打印配置

IDEA控制台没有打印彩色日志的主要原因在于 Log4j - 2.10 版本以后Log4j2默认关闭了Jansi(一个支持输出ANSI颜色的类库)

修改jvm参数: -Dlog4j.skipJansi=false

  • 修改前边pom.xml,添加彩色打印依赖
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring-boot.version}</version>
            <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>
            <version>${spring-boot.version}</version>
        </dependency>

4. application.yml中配置

logging:
  config: classpath:log4j2.xml
  level:
    com.hl.magic.mvc: debug

5.常见模板中日志格式配置

  • springboot默认的日志格式

%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${PID:-} [%15.15t] %-40.40logger{39} : %m%n

  • logback默认的日志格式

%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

  • lishuoboy推荐日志格式

%d{MM-dd HH:mm:ss.SSS} [%5level] %4line %40.40logger{39}.%-30.30method : %m%n

猜你喜欢

转载自blog.csdn.net/qq_27706119/article/details/132797014
今日推荐