关于log4j2 RollingRandomAccessFile记录日志问题

来源:互联网 发布:android精彩编程200例 编辑:程序博客网 时间:2024/05/18 06:20

maven引入的jar:

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-core</artifactId>

<version>2.6.2</version>

</dependency>

<dependency>

<groupId>org.apache.logging.log4j</groupId>

<artifactId>log4j-slf4j-impl</artifactId>

<version>2.6.2</version>

</dependency>

具体log4j2.xml如下:

<?xmlversion="1.0"encoding="UTF-8"?>

<Configurationstatus="WARN"monitorInterval="600">


<!--配置日志文件所在目录  -->

<Properties>

<Propertyname="LOG_HOME">/home/wlsadmin/data/log4j2/ici/gateway</Property>

</Properties>


<Appenders>

<!--定义日志输出格式 -->

<Consolename="Console"target="SYSTEM_OUT">

<PatternLayoutpattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>

</Console>

    <!-- 日志写入策略 immediateFlush 写入时立即刷新 日志文件-->

<RollingRandomAccessFilename="service_appender"immediateFlush="false" 

fileName="${LOG_HOME}/ici-gateway-service.log"

filePattern="${LOG_HOME}/ici-gateway-service.%d{yyyy-MM-dd}.log.gz">

<PatternLayout>

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M -- %msg%xEx%n</pattern>

</PatternLayout>

<Policies>

<!-- 一般与 filePattern联用 以日志的命名精度来确定单位 这里我用yyyy-MM-dd来记录 所以1 表示是以天为周期存储文件 -->

<TimeBasedTriggeringPolicyinterval="1"modulate="true"/>

</Policies>

<!-- 表示日志文件.gz的压缩包最大保留数 -->

<DefaultRolloverStrategymax="15"/>

</RollingRandomAccessFile>



<RollingRandomAccessFilename="accessLogger_appender"immediateFlush="false" 

fileName="${LOG_HOME}/ici-gateway-service-access.log"

filePattern="${LOG_HOME}/ici-gateway-service-access.%d{yyyy-MM-dd}.log.gz">

<PatternLayout>

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M -- %msg%xEx%n</pattern>

</PatternLayout>

<Policies>

<TimeBasedTriggeringPolicyinterval="1"/>

</Policies>

<DefaultRolloverStrategymax="15"/>

</RollingRandomAccessFile>

</Appenders>


<Loggers>

<!--定义日志的输出级别  -->

<rootlevel="INFO">

<appender-refref="Console"/>

<appender-refref="service_appender"/>

</root>

<loggername="accessLog"level="debug"includeLocation="true"additivity="true">

<appender-refref="accessLogger_appender"/>

</logger>


</Loggers>


</Configuration>


启动web应用后发现输出的日志有很大一段时间不更新或者是日志文件一直是0Kb,由于需求的问题,我们需要调整日志及时输出,然后网上搜了很多大神让我把immediateFlush属性改为true,但是发现还是没有用。最后将RollingRandomAccessFile标签改成RollingFile问题解决了。然后我百度搜了RollingRandomAccessFile和RollingFile区别然后一直没有找到,最后一个外国大佬帖子上解释到(

RandomAccessFileAppender is always buffered, while FileAppender provides a config switch (bufferedIO). Both have an "immediateFlush" config option in case you want to be sure your messages are on disk (e.g. audit logging). Finally, the default buffer size for RandomAccessFileAppender is larger: 256*1024 bytes vs 8*1024 bytes for FileAppender (both appenders buffer size can be set in configuration).

)。大概意思是说log4j2的RollingRandomAccessFile 默认日志文件写入策略为异步刷盘,引出一个缓冲区(buffer)的概念,RollingRandomAccessFile 会将日志信息先写入到缓冲区,然后缓冲区满后刷到磁盘,并清空缓冲区,默认缓冲区的大小在8-256kb,具体大小需要自己设置。

以上全为我个人理解,如果各位大神觉得我理解有不对地方欢迎指正,共同进步。

原创粉丝点击