关于java:Springboot-2x-使用-Log4j2-异步打印日志

40次阅读

共计 4365 个字符,预计需要花费 11 分钟才能阅读完成。

介绍

目前罕用的 Java 日志框架有 Log4j、Logback、Log4j2,性能方面举荐应用异步的 Log4j2,具体比照不多做剖析,前人早已实现耕荒,咱们就站在伟人的肩膀上来看看如何实操。

SLF4J,简略日志门面(Simple Logging Facade for Java),是一个用于日志零碎的简略 Facade,不是具体的日志解决方案,而是通过 Facade Pattern 提供一些 Java logging API,我的了解是它和 Log4j、Logback、Log4j2 的关系相似于 Java 接口与实现类的关系。

1、pom 筹备

1.1、war 包 web 工程

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- 排除 springboot 默认的 logback 依赖 -->
        <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>
    <version>2.2.6.RELEASE</version>
</dependency>
<!-- 异步, 应用 log4j2 的 AsyncLogger 时须要蕴含 disruptor-->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.4.2</version>
</dependency>

1.2、jar 包自启动工程

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <!-- 排除 springboot 默认的 logback 依赖 -->
        <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>
    <version>2.2.6.RELEASE</version>
</dependency>
<!-- 异步, 应用 log4j2 的 AsyncLogger 时须要蕴含 disruptor-->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.4.2</version>
</dependency>

2、application.yml 配置

# 引入日志配置文件
logging:
  config: classpath:log4j2.xml

3、log4j2.xml 配置

classpath:log4j2.xml 的话,log4j2.xml 放在目录 resources 下即可

<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration 前面的 status,这个用于设置 log4j2 本身外部的信息输入级别,能够不设置,当设置成 trace 时,你会看到 log4j2 外部各种具体输入 -->
<!--monitorInterval:Log4j2 可能自动检测批改配置 文件和重新配置自身,设置距离秒数 -->
<configuration status="error"  monitorInterval="30">
    <!-- 日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->

    <!-- 变量配置 -->
    <Properties>
        <!-- 格式化输入:%date 示意日期,%thread 示意线程名,%-5level:级别从左显示 5 个字符宽度 %msg:日志音讯,%n 是换行符 -->
        <!-- %logger{36} 示意 Logger 名字最长 36 个字符 -->
        <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%logger{50}:%L] - %msg%n" />
        <!-- 定义日志存储的门路 -->
        <property name="FILE_PATH" value="/var/log/songo" />
        <property name="FILE_NAME" value="songo" />
    </Properties>

    <appenders>

        <console name="Console" target="SYSTEM_OUT">
            <!-- 输入日志的格局 -->
            <PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
        </console>

        <!-- 这个会打印出所有的 info 及以上级别的信息,每次大小超过 size,则这 size 大小的日志会主动存入按年份 - 月份建设的文件夹上面并进行压缩,作为存档 -->
        <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}/${FILE_NAME}.log" filePattern="${FILE_PATH}/${FILE_NAME}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz" append="true">
            <PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
            <Policies>
                <!-- 基于工夫的触发策略。该策略次要是实现周期性的 log 文件封存工作。有两个参数:interval,integer 型,指定两次封存动作之间的工夫距离。单位: 以日志的命名精度来确定单位,比方 yyyy-MM-dd-HH 单位为小时,yyyy-MM-dd-HH-mm 单位为分钟
               modulate,boolean 型,阐明是否对封存工夫进行调制。若 modulate=true,则封存工夫将以 0 点为边界进行偏移计算。比方,modulate=true,interval=4hours,那么假如上次封存日志的工夫为 00:00,则下次封存日志的工夫为 04:00,之后的封存工夫顺次为 08:00,12:00,16:00-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy 属性如不设置,则默认为最多同一文件夹下当天 7 个文件后开始笼罩 -->
            <DefaultRolloverStrategy max="30">
                <!-- 删除解决策略,在配置的门路中搜寻,maxDepth 示意往下搜寻的最大深度 -->
                <Delete basePath="${FILE_PATH}/${FILE_NAME}/" maxDepth="2">
                    <!-- 文件名搜寻匹配,反对正则 -->
                    <IfFileName glob="*.log.gz" />
                    <!--!Note: 这里的 age 必须和 filePattern 协调, 后者是准确到 dd, 这里就要写成 xd, xD 就不起作用
                    另外, 数字最好 >2, 否则可能造成删除的时候, 最近的文件还处于被占用状态, 导致删除不胜利!-->
                    <!-- 7 天 -->
                    <IfLastModified age="7d" />
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </appenders>

    <!--Logger 节点用来独自指定日志的模式,比方要为指定包下的 class 指定不同的日志级别等。-->
    <!-- 而后定义 loggers,只有定义了 logger 并引入的 appender,appender 才会失效 -->
    <loggers>
        <!-- 若是 additivity 设为 false,则子 Logger 只会在本人的 appender 里输入,而不会在父 Logger 的 appender 里输入。-->
        <!--Console、RollingFileInfo 没有配置 ThresholdFilter,默认走的是 AsyncRoot 的 level 级别,com.songo.mapper 为我我的项目 mapper 的包门路,级别设为 debug,能够打印 sql 语句 -->
        <AsyncLogger name="com.songo.mapper" level="debug" additivity="false">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
        </AsyncLogger>
        <AsyncLogger name="org.springframework" level="warn" additivity="false">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
        </AsyncLogger>
        <AsyncRoot level="info" includeLocation="true">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFileInfo" />
        </AsyncRoot>
    </loggers>
</configuration>

4、验证

服务启动时,找到 log4j2 的线程,是如下内容阐明 log4j2 异步日志打印配置胜利

记录如有不对烦请指出,后行感激

正文完
 0