本方法于2018-02-13号运行通过。

一、log4j2 配置文件结构图

20160620200255928.png

二、log4j2 Maven

先删除log4j 1.x版本的依赖,删除log4j.properties,再加入log4j2的依赖。log4j-slf4j-impl中包括了log4j-core和log4j-api

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.10.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>2.10.0</version>
</dependency>

三、log4j2 配置文件加载

log4j2 的配置文件只用 xml、json、jsn 三种格式,默认情况下由系统自动加载,系统加载 classpath 目录如下的配置文件: 

- log4j-test.json/log4j-test.jsn/log4j2-test.xml 

- log4j.json/log4j.jsn/log4j2.xml 

加载优先级由上向下,且只加载其一。

四、log4j2 配置文件说明

如果是Servlet2.5及以下版本,需要在web.xml里加入以下代码,3.0及以上版本不需要。

<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>
        <dispatcher>ASYNC</dispatcher><!-- Servlet 3.0 w/ disabled auto-initialization only; not supported in 2.5 -->
    </filter-mapping>


log4j2.xml 

<?xml version="1.0" encoding="UTF-8" ?>
<!-- configure.status 为设置日志输出级别,级别如下:OFF 、FATAL 、ERROR、WARN、INFO、DEBUG、TRACE 、ALL  -->
<!-- configure.monitorInterval 监控间隔,指log4j2每隔600秒(10分钟),自动监控该配置文件是否有变化,如果变化,则自动根据文件内容重新配置 -->
<Configuration status="WARN" monitorInterval="600">

    <Properties>
        <!--配置日志文件输出目录,此配置将日志输出到tomcat所在盘(支持Windows和Linux)根目录下的指定文件夹-->
        <Property name="LOG_HOME">/logs/reinforce</Property>
        <property name="LOG_BACK_HOME">${LOG_HOME}/backup</property>
        <property name="TRACE_FILE_NAME">trace</property>
        <property name="ERROR_FILE_NAME">error</property>
        <property name="WARN_FILE_NAME">warn</property>
        <property name="INFO_FILE_NAME">info</property>
        <property name="DEBUG_FILE_NAME">debug</property>
        <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS}  %-5level ${sys:PID} --- [%15thread] %-45logger{45} : %m%n</property>
        <property name="PATTERN_OUT">%d{yyyy-MM-dd HH:mm:ss.SSS}  %green{%-5level} %magenta{${sys:PID}} --- [%15thread] %cyan{%-45logger{45}} : %m%n</property>
    </Properties>

    <Appenders>
        <!--这个输出控制台的配置,这里输出除了info,warn和error级别的信息到System.out-->
        <Console name="console_out_appender" target="SYSTEM_OUT">
            <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 输出日志的格式 -->
            <PatternLayout pattern="${PATTERN_OUT}"/>
            <withJansi>true</withJansi>
        </Console>

        <!-- TRACE级别日志 -->
        <!-- 设置日志格式并配置日志压缩格式,压缩文件独立放在一个文件夹内,
        日期格式不能为冒号,否则无法生成,因为文件名不允许有冒号,此appender只输出trace级别的数据到trace.log -->
        <RollingRandomAccessFile name="TraceLog" fileName="${LOG_HOME}/${TRACE_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${TRACE_FILE_NAME}.%d{yyyy-MM-dd}.log">
            <PatternLayout pattern="${PATTERN}"/>
            <Policies>
                <!-- 每个日志文件最大5MB -->
                <SizeBasedTriggeringPolicy size="5MB"/>
            </Policies>
            <Filters><!-- 此Filter意思是,只输出debug级别的数据 -->
                <!-- DENY,日志将立即被抛弃不再经过其他过滤器;
                NEUTRAL,有序列表里的下个过滤器过接着处理日志;
                ACCEPT,日志会被立即处理,不再经过剩余过滤器。 -->
                <ThresholdFilter level="debug" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingRandomAccessFile>


        <!-- 配置日志输出文件名字     追加读写 -->
        <!-- Error console log -->
        <RollingFile name="ErrLog" fileName="${LOG_HOME}/${ERROR_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${ERROR_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true">
            <!-- 输出格式 -->
            <PatternLayout pattern="${PATTERN}"/>
            <!-- 设置策略 -->
            <Policies>
                <!-- 基于时间的触发策略。该策略主要是完成周期性的log文件封存工作。有两个参数:
                    interval,integer型,指定两次封存动作之间的时间间隔。单位:以日志的命名精度来确定单位,
                        比如yyyy-MM-dd-HH 单位为小时,yyyy-MM-dd-HH-mm 单位为分钟
                    modulate,boolean型,说明是否对封存时间进行调制。若modulate=true,
                        则封存时间将以0点为边界进行偏移计算。比如,modulate=true,interval=4hours,
                        那么假设上次封存日志的时间为03:00,则下次封存日志的时间为04:00,
                        之后的封存时间依次为08:00,12:00,16:00
                 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <Filters>
                <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingFile>

        <!-- Warn console log -->
        <RollingFile name="WarnLog" fileName="${LOG_HOME}/${WARN_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${WARN_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true">
            <!-- 输出格式 -->
            <PatternLayout pattern="${PATTERN}"/>
            <!-- 设置策略 -->
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <Filters>
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingFile>
        <!-- Info console log -->
        <RollingFile name="InfoLog" fileName="${LOG_HOME}/${INFO_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${INFO_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true">
            <!-- 输出格式 -->
            <PatternLayout pattern="${PATTERN}"/>
            <!-- 设置策略 -->
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <Filters>
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingFile>
        <!-- Debug console log -->
        <RollingFile name="DebugLog" fileName="${LOG_HOME}/${DEBUG_FILE_NAME}.log" filePattern="${LOG_BACK_HOME}/$${date:yyyy-MM}/${DEBUG_FILE_NAME}.%d{yyyy-MM-dd}.log" append="true">
            <!-- 输出格式 -->
            <PatternLayout pattern="${PATTERN}"/>
            <!-- 设置策略 -->
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
            <Filters>
                <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
                <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingFile>
    </Appenders>

    <Loggers>
        <!-- 配置日志的根节点 -->
        <root level="trace">
            <appender-ref ref="console_out_appender"/>
            <AppenderRef ref="TraceLog" />
            <AppenderRef ref="InfoLog" />
            <AppenderRef ref="WarnLog" />
            <AppenderRef ref="ErrLog" />
            <AppenderRef ref="Console"/>
        </root>

        <!-- 第三方日志系统 -->
        <logger name="org.springframework.core" level="info"/>
        <logger name="org.springframework.beans" level="info"/>
        <logger name="org.springframework.context" level="info"/>
        <logger name="org.springframework.web" level="info"/>
        <logger name="org.jboss.netty" level="warn"/>
        <logger name="org.apache.http" level="warn"/>

    </Loggers>

</Configuration>


五、代码中使用

private static Logger logger = LogManager.getLogger(xxx.class.getName());


logger.info("info");
logger.error("error");
logger.warn("warn");


六、一些系统变量

PID -------  ${sys:PID}

赞助本站,网站的持续发展离不开你们的支持!一分也是爱ヾ(◍°∇°◍)ノ゙
 本文链接: ,花了好多脑细胞写的,转载请注明链接喔~~
登陆
      正在加载评论