关于log4j2 RollingRandomAccessFile记录日志问题

本文介绍了一个关于Log4j2日志框架中日志输出延迟的问题及解决方案。通过对日志配置文件log4j2.xml的具体分析,探讨了不同日志Appender(如RollingRandomAccessFile与RollingFile)之间的区别,并最终通过修改配置解决了日志实时性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,具体大小需要自己设置。

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值