spring Boot 整合 slf4j+log4j2 实现日志管理

第一步:maven依赖导入,spring boot 默认日志实现为logback,需要去除,不然会报错

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <!-- 去掉logback配置 -->
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
​
    <!-- 引入log4j2依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
</dependencies>

第二步:添加日志配置文件 log4j2-spring.xml

<?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>
        <!--
            格式化输出:
            %d表示日期,
            %thread表示线程名,
            %-5level:级别从左显示5个字符宽度
            %msg:日志消息,%n是换行符
            %logger{36} 表示 Logger 名字最长36个字符
        -->
        <property name="LOG_PATTERN"
                  value="%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level}[%thread] %style{%logger{36}}{cyan} : %msg%n"/>
​
        <!-- 定义日志存储的路径,不要配置相对路径 -->
        <property name="FILE_PATH" value="./logs"/>
        <!-- 服务名 -->
        <property name="FILE_NAME" value="demo"/>
    </Properties>
​
    <appenders>
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="${LOG_PATTERN}" disableAnsi="false" noConsoleNoAnsi="false"/>
            <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
        </console>
​
        <!--
          这个会打印出所有的info及以下级别的信息,每次大小超过size,
          则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档
        -->
        <RollingFile name="RollingFileDebug"
                     fileName="${FILE_PATH}/demoLog.log"
                     filePattern="${FILE_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-Log_%i.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--interval属性用来指定多久滚动一次,默认是1 hour-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="20MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖 -->
            <DefaultRolloverStrategy max="15"/>
        </RollingFile>
​
                <!--
                  这个会打印出所有的info及以下级别的信息,每次大小超过size,
                  则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档
                -->
                <RollingFile name="RollingFileInfo"
                             fileName="${FILE_PATH}/info.log"
                             filePattern="${FILE_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-INFO_%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="20MB"/>
                    </Policies>
                    <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖 -->
                    <DefaultRolloverStrategy max="15"/>
                </RollingFile>
​
                <!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
                <RollingFile name="RollingFileWarn"
                             fileName="${FILE_PATH}/warn.log"
                             filePattern="${FILE_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-WARN_%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="20MB"/>
                    </Policies>
                    <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
                    <DefaultRolloverStrategy max="15"/>
                </RollingFile>
​
                <!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
                <RollingFile name="RollingFileError"
                             fileName="${FILE_PATH}/error.log"
                             filePattern="${FILE_PATH}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-ERROR_%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="20MB"/>
                    </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>
                <logger name="org.springframework" level="info" additivity="false">
                    <AppenderRef ref="Console"/>
                </logger>
                <logger name="springfox.documentation" level="info" additivity="false">
                    <AppenderRef ref="Console"/>
                </logger>
                <logger name="org.hibernate" level="info" additivity="false">
                    <AppenderRef ref="Console"/>
                </logger>
                <logger name="io.lettuce" level="info" additivity="false">
                    <AppenderRef ref="Console"/>
                </logger>
                <logger name="io.netty" level="info" additivity="false">
                    <AppenderRef ref="Console"/>
                </logger>
        <!--监控系统信息-->
        <!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
        <Logger name="top.fate" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>
​
        <root level="info">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileDebug"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>
</configuration>

使用方式

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
​
// 两种写法都可以,第一种不用每次都要修改类名,但第一种不能用static来进行修饰
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private static final Logger logger = LoggerFactory.getLogger(XX.class);
​
logger.debug("this is debug");
logger.info("this is info");

全局异步日志开启,提高日志性能

创建 log4j2.component.properties 文件

#全局异步日志开启,提高日志性能
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

注意点

<!-- 集成 log4j2时,并启用日志异步时出现NoClassDefFoundError: com/lmax/disruptor/TimeoutBlockingWaitStrategy-->
        <!-- 并发编程包 https://mvnrepository.com/artifact/com.lmax/disruptor -->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.4.4</version>
        </dependency>

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值