LOG4J2 使用示例

Posted OkidoGreen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LOG4J2 使用示例相关的知识,希望对你有一定的参考价值。

pom:

<slf4j.version>1.7.10</slf4j.version>
        <log4j2.version>2.3</log4j2.version>
        <disruptor.version>3.3.4</disruptor.version>

<!-- log4j2-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>$slf4j.version</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>$slf4j.version</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jul-to-slf4j</artifactId>
            <version>$slf4j.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-core</artifactId>
            <version>$log4j2.version</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>$log4j2.version</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-1.2-api</artifactId>
            <version>$log4j2.version</version>
        </dependency>
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>$disruptor.version</version>
        </dependency>

        <!-- log4j2-->

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" >
    <properties>
        <property name="LOG_HOME">/data/applogs/emidas-coupon-service</property>
    </properties>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%dateyyyy-MM-dd HH:mm:ss.SSS][%thread][%level][%class][%line]:%message%n" />
        </Console>

        <RollingRandomAccessFile name="infoLog" fileName="$LOG_HOME/app.log"
                                 filePattern="$LOG_HOME/info.%dyyyy-MM-dd.log.gz" append="true">
            <PatternLayout pattern="[%dateyyyy-MM-dd HH:mm:ss.SSS][%thread][%level][%class][%line]:%message%n"/>
            <Filters>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
            </Filters>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingRandomAccessFile>
        <RollingRandomAccessFile name="warnLog" fileName="$LOG_HOME/warn.log"
                                 filePattern="$LOG_HOME/warn.%dyyyy-MM-dd.log.gz" append="true">
            <Filters>
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="[%dateyyyy-MM-dd HH:mm:ss.SSS][%thread][%level][%class][%line]:%message%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingRandomAccessFile>
        <RollingRandomAccessFile name="errorLog" fileName="$LOG_HOME/error.log"
                                 filePattern="$LOG_HOME/error.%dyyyy-MM-dd.log.gz" append="true">
            <Filters>
                <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
            <PatternLayout pattern="[%dateyyyy-MM-dd HH:mm:ss.SSS][%thread][%level][%class][%line]:%message%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingRandomAccessFile>

        <!-- synchronize -->
        <RollingRandomAccessFile name="synchronizeLog" fileName="$LOG_HOME/synchronize.log"
                                 filePattern="$LOG_HOME/synchronize.%dyyyy-MM-dd-%i.log.gz" append="true">
            <PatternLayout pattern="[emidas-lottery-job][%dateyyyy-MM-dd HH:mm:ss.SSS][%thread][%level][%class][%line]:%message%n"/>
            <Filters>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
            </Filters>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="30"/>
        </RollingRandomAccessFile>

        <Cat name="catAppender">
            <PatternLayout pattern="[%dateyyyy-MM-dd HH:mm:ss.SSS][%thread][%level][%class][%line]:%message%n"/>
        </Cat>
    </Appenders>

    <Loggers>
        <!-- 第三方的软件日志级别 -->
        <AsyncLogger name="org.springframework" level="info" additivity="true">
            <AppenderRef ref="warnLog"/>
            <AppenderRef ref="errorLog"/>
        </AsyncLogger>

        <!-- 应用的日志级别 -->
        <AsyncLogger name="com.xxxx.emidas.coupon" level="info" additivity="true">
            <AppenderRef ref="infoLog"/>
            <AppenderRef ref="warnLog"/>
            <AppenderRef ref="errorLog"/>
        </AsyncLogger>

// includeLocation="true" 异步日志中加入类名及行数等详细信息(性能会下降),默认false
        <AsyncLogger name="synchronize" level="info" additivity="false"  includeLocation="true">
            <AppenderRef ref="synchronizeLog"/>
            <AppenderRef ref="Console" />
        </AsyncLogger>

        <!--<logger name="java.sql.PreparedStatement" level="debug" additivity="true">-->
            <!--<AppenderRef ref="Console"/>-->
        <!--</logger>-->
        <!--<logger name="com.xxxx.emidas.coupon.dao.mapper" level="debug" additivity="false">-->
            <!--<AppenderRef ref="Console"/>-->
        <!--</logger>-->

        <!-- 剩余其他的日志级别 -->
        <asyncRoot level="info" includeLocation="true">
            <AppenderRef ref="infoLog" />
            <AppenderRef ref="Console" />
            <AppenderRef ref="catAppender"/>
        </asyncRoot>
    </Loggers>
</Configuration>

web.xml 配置:

<!--由Sprng载入的Log4j配置文件位置 -->
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:log4j2.xml</param-value>
    </context-param>

    <!--Spring默认刷新Log4j配置文件的间隔,单位为毫秒 -->
    <context-param>
        <param-name>log4jRefreshInterval</param-name>
        <param-value>60000</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>


使用工具类:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class LogUtil 
    /**
     * 获得Logger
     * @param clazz 日志发出的类
     * @return Logger
     */
    public static Logger get(Class<?> clazz) 
        return LogManager.getLogger(clazz);
    

    /**
     * 获得Logger
     * @param name 自定义的日志发出者名称
     * @return Logger
     */
    public static Logger get(String name) 
        return LogManager.getLogger(name);
    

    /**
     * @return 获得日志,自动判定日志发出者
     */
    public static Logger get() 
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        return LogManager.getLogger(stackTrace[2].getClassName());
    

    //----------------------------------------------------------- Logger method start
    //------------------------ Trace
    /**
     * Trace等级日志,小于debug<br>
     * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
     * @param format 格式文本, 代表变量
     * @param arguments 变量对应的参数
     */
    public static void trace(String format, Object... arguments) 
        trace(innerGet(), format, arguments);
    

    /**
     * Trace等级日志,小于Debug
     * @param log 日志对象
     * @param format 格式文本, 代表变量
     * @param arguments 变量对应的参数
     */
    public static void trace(Logger log, String format, Object... arguments) 
        log.trace(format, arguments);
    

    //------------------------ debug
    /**
     * Debug等级日志,小于Info<br>
     * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
     * @param format 格式文本, 代表变量
     * @param arguments 变量对应的参数
     */
    public static void debug(String format, Object... arguments) 
        debug(innerGet(), format, arguments);
    

    /**
     * Debug等级日志,小于Info
     * @param log 日志对象
     * @param format 格式文本, 代表变量
     * @param arguments 变量对应的参数
     */
    public static void debug(Logger log, String format, Object... arguments) 
        log.debug(format, arguments);
    

    //------------------------ info
    /**
     * Info等级日志,小于Warn<br>
     * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
     * @param format 格式文本, 代表变量
     * @param arguments 变量对应的参数
     */
    public static void info(String format, Object... arguments) 
        info(innerGet(), format, arguments);
    

    /**
     * Info等级日志,小于Warn
     * @param log 日志对象
     * @param format 格式文本, 代表变量
     * @param arguments 变量对应的参数
     */
    public static void info(Logger log, String format, Object... arguments) 
        log.info(format, arguments);
    

    //------------------------ warn
    /**
     * Warn等级日志,小于Error<br>
     * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
     * @param format 格式文本, 代表变量
     * @param arguments 变量对应的参数
     */
    public static void warn(String format, Object... arguments) 
        warn(innerGet(), format, arguments);
    

    /**
     * Warn等级日志,小于Error
     * @param log 日志对象
     * @param format 格式文本, 代表变量
     * @param arguments 变量对应的参数
     */
    public static void warn(Logger log, String format, Object... arguments) 
        log.warn(format, arguments);
    

    /**
     * Warn等级日志,小于Error<br>
     * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
     * @param e 需在日志中堆栈打印的异常
     * @param format 格式文本, 代表变量
     * @param arguments 变量对应的参数
     */
    public static void warn(Throwable e, String format, Object... arguments) 
        warn(innerGet(), e, format(format, arguments));
    

    /**
     * Warn等级日志,小于Error
     * @param log 日志对象
     * @param e 需在日志中堆栈打印的异常
     * @param format 格式文本, 代表变量
     * @param arguments 变量对应的参数
     */
    public static void warn(Logger log, Throwable e, String format, Object... arguments) 
        log.warn(format(format, arguments), e);
    

    //------------------------ error
    /**
     * Error等级日志<br>
     * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
     * @param format 格式文本, 代表变量
     * @param arguments 变量对应的参数
     */
    public static void error(String format, Object... arguments) 
        error(innerGet(), format, arguments);
    

    /**
     * Error等级日志<br>
     * @param log 日志对象
     * @param format 格式文本, 代表变量
     * @param arguments 变量对应的参数
     */
    public static void error(Logger log, String format, Object... arguments) 
        log.error(format, arguments);
    

    /**
     * Error等级日志<br>
     * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
     * @param e 需在日志中堆栈打印的异常
     * @param format 格式文本, 代表变量
     * @param arguments 变量对应的参数
     */
    public static void error(Throwable e, String format, Object... arguments) 
        error(innerGet(), e, format(format, arguments));
    

    /**
     * Error等级日志<br>
     * 由于动态获取Logger,效率较低,建议在非频繁调用的情况下使用!!
     * @param log 日志对象
     * @param e 需在日志中堆栈打印的异常
     * @param format 格式文本, 代表变量
     * @param arguments 变量对应的参数
     */
    public static void error(Logger log, Throwable e, String format, Object... arguments) 
        log.error(format(format, arguments), e);
    
    //----------------------------------------------------------- Logger method end

    //----------------------------------------------------------- Private method start
    /**
     * 格式化文本
     * @param template 文本模板,被替换的部分用  表示
     * @param values 参数值
     * @return 格式化后的文本
     */
    private static String format(String template, Object... values) 
        return String.format(template.replace("", "%s"), values);
    

    /**
     * @return 获得日志,自动判定日志发出者
     */
    private static Logger innerGet() 
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        return LogManager.getLogger(stackTrace[3].getClassName());
    
    //----------------------------------------------------------- Private method end


使用:

1、根据类名

private static final Logger logger = LogUtil.get(AuthAspect.class);
logger.info("Authority check failed :appName =  , method =  ",appName,joinPoint.getSignature().getName());


2、根据日志Logger配置

private static final Logger logger = LogUtil.get("synchronize");
logger.info("Synchronize failed || packageId already exists ,packageId = ",packageId);



以上是关于LOG4J2 使用示例的主要内容,如果未能解决你的问题,请参考以下文章

log4j2 中基于时间的触发策略

Log4j2分析与实践

log4j2漏洞复现与利用

详解log4j2(上) - 从基础到实战

Spring Boot 使用 Log4j2 & Logback 输出日志到 EKL

Log4j2 - 将存档添加到当前配置