Spring 集成 Log4j 2.x 实现日志管理

Spring 集成 log4j 2.x 实现日志管理:

1.pom.xml 引入 JAR 包依赖;

<!-- 添加slf4j依赖 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>

<!-- 添加log4j2依赖 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.1</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.11.1</version>
</dependency>
<!-- web容器中需要添加log4j-web -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>2.11.1</version>
</dependency>
<!-- 桥接slf4j -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.11.1</version>
</dependency>

2.web.xml 中 添加配置;

<!-- 配置Log4j 2.x 日志框架 -->
<!-- 配置到最前面 避免日志不能正常打印 -->
<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>classpath:log4j2.xml</param-value>
</context-param>
<listener>
    <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
<filter>
    <filter-name>log4jServletFilter</filter-name>
    <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>log4jServletFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

3.classpath 下创建 log4j2 配置文件,命名为 log4j2.xml;

<?xml version="1.0" encoding="UTF-8"?>
<!--
    status: 用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,会看到log4j2内部各种详细输出
    monitorInterval: Log4j能够自动检测修改配置文件和重新配置本身,设置间隔秒数
-->
<Configuration status="off" monitorInterval="1800">
    <!--  全局属性-->
    <Properties>
        <!-- 日志文件输出目录:输出到Tomcat根目录 -->
        <Property name="log.tomcat.path">${sys:catalina.home}</Property>
        <!-- 日志文件输出目录:输出到项目根目录 -->
        <Property name="log.web.path">${web:rootDir}</Property>

        <Property name="log.local.path">d:/logs/dongzz-security</Property>
    </Properties>

    <!-- 输出源 -->
    <Appenders>
        <!-- 日志级别从高到低:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL -->
        <!--
            日志格式:
            %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间
            %p : 日志输出格式
            %c : logger的名称
            %m : 日志内容,即 logger.info("日志内容")
            %n : 换行符
            %C : Java类名
            %L : 日志输出所在行数
            %M : 日志输出所在方法名
            hostName : 本地机器名
            hostAddress : 本地ip地址
         -->

        <!-- 输出到控制台:输出DEBUG及以上级别的信息到 System.out -->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- 过滤规则 -->
            <!-- 输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <!--
                ACCEPT:日志会被立即处理,不再经过剩余过滤器
                DENY:日志将立即被抛弃不再经过其他过滤器
                NEUTRAL:有序列表里的下个过滤器接着处理日志
            -->
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY" />
            <!-- 日志格式 -->
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />
            <!-- <PatternLayout pattern="%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n" /> -->
        </Console>

        <!-- INFO级别日志 设置日志格式并配置日志压缩格式,压缩文件独立放在一个文件夹内,日期格式不能为冒号,否则无法生成,因为文件名不允许有冒号 -->
        <RollingFile name="info_appender" immediateFlush="true" fileName="${log.local.path}/info.log" filePattern="${log.local.path}/info - %d{yyyy-MM-dd HH_mm_ss}.log.gz">
            <!-- 日志格式 -->
            <PatternLayout>
                <pattern>%5p [%t] %d{yyyy-MM-dd HH:mm:ss} (%F:%L) %m%n</pattern>
            </PatternLayout>
            <!-- 压缩规则 -->
            <Policies>
                <!-- 每个日志文件最大2MB -->
                <SizeBasedTriggeringPolicy size="2MB" />
                <!-- 如果启用此配置,则日志会按文件名生成新压缩文件,即如果filePattern配置的日期格式为 %d{yyyy-MM-dd HH},则每小时生成一个压缩文件,如果filePattern配置的日期格式为 %d{yyyy-MM-dd},则每天生成一个压缩文件 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <!-- 过滤规则 -->
            <Filters>
                <!-- 仅仅输出 INFO 级别的日志 -->
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
            </Filters>
        </RollingFile>

    </Appenders>

    <!-- 记录器 -->
    <Loggers>
        <!-- 全局日志记录器 -->
        <Root level="off" additivity="false">
            <!-- 输出到控制台 -->
            <AppenderRef ref="Console"/>

        </Root>

        <!-- 自定义日志记录器 -->

        <!-- 禁止打印 指定包 日志 -->
        <!--<Logger name="org.springframework" level="off" />-->

        <!--
            Logger 存在继承关系 Root是根节点
            additivity: 是否继承 Root Logger 的 输出源
            true:日志会在父Logger的输出源打印
            false:日志仅在当前Logger的输出源打印
        -->
        <Logger name="com.dongzz.security" level="INFO" additivity="false">
            <!-- 打印到日志文件 -->
            <!--<AppenderRef ref="info_appender" />-->
            <!-- 打印到控制台 -->
            <AppenderRef ref="Console" />
        </Logger>

    </Loggers>
</Configuration>

4.测试:

package com.dongzz.security.log4j2;

import com.dongzz.security.SpringBaseJunit;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;

/**
 * 测试 Log4j 2.x 日志框架
 */
public class Log4j2Test extends SpringBaseJunit {

    //日志记录器
    public static final Logger logger = LogManager.getLogger(Log4j2Test.class);;

    @Test
    public void log4j2Test(){
        logger.trace("===trace message");
        logger.debug("===debug message");
        logger.info("===info message");
        logger.warn("===warn message");
        logger.error("===error message");
        logger.fatal("===fatal message");
        System.out.println("This is log4j2 test!!!");
    }
}