log4j2 RollingRandomAccessFile配置

                 log4j2 RollingRandomAccessFile配置


转载:https://garssion.iteye.com/blog/2369929

一、需求背景

1. 日志按小时压缩成zip文件。

2. 仅保存距离当前时间最近24小时的历史压缩文件。

3. 压缩封存的zip文件,按照零点为参考点纠偏。

4. 将com.roadway.acceptor.base.DebugUtils类的日志输出到指定文件,且不再输出到其他文件。

 

二、log4j2 配置实现

xml代码
 

<?xml version="1.0" encoding="UTF-8"?>  
  
<Configuration status="INFO" monitorInterval="120">  
    <properties>    
        <property name="MSG_LOG_HOME">/data/gpslog</property>  
    </properties>  
  
    <Appenders>  
        <Console name="Console" target="SYSTEM_OUT">  
            <PatternLayout pattern="%d [%t] %-5p [%c] - %m%n" />  
        </Console>  
  
        <RollingRandomAccessFile name="msgAppender" immediateFlush="true"  
            fileName="${MSG_LOG_HOME}/msg.log"  
            filePattern="${MSG_LOG_HOME}/backup/msg.%d{yyyyMMddHH}.zip">  
  
            <Filters>  
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>  
            </Filters>  
  
            <PatternLayout pattern="%m%n" />  
            <Policies>  
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>  
            </Policies>    
  
            <DefaultRolloverStrategy max="24">  
                <Delete basePath="${MSG_LOG_HOME}" maxDepth="2">  
                  <IfFileName glob="*/msg.*.zip" />  
                  <IfLastModified age="24H" />  
                </Delete>  
            </DefaultRolloverStrategy>  
        </RollingRandomAccessFile>  
    </Appenders>  
  
    <Loggers>  
        <AsyncLogger name="com.roadway.DebugUtils" additivity="FALSE" level="INFO">  
            <appender-ref ref="msgAppender" />  
        </AsyncLogger>  
    </Loggers>  
</Configuration>  

 三、配置说明

1. monitorInterval,博客配置的为120,单位为秒。即在服务运行过程中发生了log4j2配置文件的修改,log4j2能够在monitorInterval时间范围重新加载配置,无需重启应用。

 

2. property配置文件全局属性的声明,使用方式为:${声明的属性名称}。

    ${sys:catalina.home}为tomcat部署路径,例如:/data/tomcat。

 

3. RollingRandomAccessFile基本属性

    name:Appender名称

    immediateFlush:log4j2接收到日志事件时,是否立即将日志刷到磁盘。默认为true。

    fileName:日志存储路径

    filePattern:历史日志封存路径。其中%d{yyyyMMddHH}表示了封存历史日志的时间单位(目前单位为小时,yyyy表示年,MM表示月,dd表示天,HH表示小时,mm表示分钟,ss表示秒,SS表示毫秒)。注意后缀,log4j2自动识别zip等后缀,表示历史日志需要压缩。

 

4. TimeBasedTriggeringPolicy

interval:表示历史日志封存间隔时间,单位为filePattern设置的单位值

modulate:表示是否历史日志生成时间纠偏,纠偏以零点为基准进行。比如:15:16生成了msg.2017041715.zip文件,那么纠偏后会在16:00生成msg.2017041716.zip

 

5. ThresholdFilter

     level,表示最低接受的日志级别,博客配置的为INFO,即我们期望打印INFO级别以上的日志。

     onMatch,表示当日志事件的日志级别与level一致时,应怎么做。一般为ACCEPT,表示接受。

     onMismatch,表示日志事件的日志级别与level不一致时,应怎么做。一般为DENY,表示拒绝。也可以为NEUTRAL表示中立。

6. 保存24小时历史日志,但不想用文件索引

Xml代码

<DefaultRolloverStrategy max="24">  
    <Delete basePath="${MSG_LOG_HOME}" maxDepth="2">  
        <IfFileName glob="*/msg.*.zip" />  
        <IfLastModified age="24H" />  
    </Delete>  
</DefaultRolloverStrategy>  

备注:

1. age的单位:D、H、M、S,分别表示天、小时、分钟、秒

2. basePath表示日志存储的基目录,maxDepth=“1”表示当前目录。因为我们封存的历史日志在basePath里面的backup目录,所以maxDepth设置为2。

 

7. RollingRandomAccessFile设置bufferSize不生效问题

a. log4j2配置如下:

Xml代码

<RollingRandomAccessFile name="msgAppender"   
   immediateFlush="false"   
   bufferSize="512"  
   fileName="${MSG_LOG_HOME}/msg.log"  
   filePattern="${MSG_LOG_HOME}/backup/msg.%d{yyyyMMddHH}.zip">  
  
   ......  

b. 使用异步Logger方式输出日志

Xml代码

......  
  
<AsyncLogger name="com.roadway.DebugUtils" additivity="FALSE" level="INFO">  
    <appender-ref ref="msgAppender" />  
</AsyncLogger>  
  
......  

c. 验证

经过反复测试验证,日志始终实时刷新到磁盘,这是为什么?查看log4j2文档发现:

Asynchronous loggers and appenders will automatically flush at the end of a batch of events, even if immediateFlush is set to false. This also guarantees the data is written to disk but is more efficient.

因此,如果期望使用RollingRandomAccessFile异步的方式打印输出日志,bufferSize是无法生效的且也没有必要采用buffer的方式。

请参考log4j2官网地址:http://logging.apache.org/log4j/2.x/manual/appenders.html

上一篇:springboot 集成freemarker


下一篇:Caused by: freemarker.core.Configurable$UnknownSettingException: Unknown FreeMarker configuration s