如何通过log4j控制每日滚动和最大文件大小的日志文件?

时间:2011-11-03 11:21:06

标签: log4j rollingfileappender

我想创建可以在第二天开始时滚动的日志文件,或者如果达到指定的文件大小,日志文件必须包含在日期文件夹中。 文件夹格式为YYYYMMDD/20111103/mylogfile.log

是否可以通过Log4j执行此操作而不实现自定义类?

现在我正在使用log4j和log4j-extra, 我将log4j API中定义的FileNamePattern属性设置为每天滚动我的文件 并将最大文件大小设置为50 MB。

我的log4j.xml是:

<appender name="MYAPPENDER" class="org.apache.log4j.rolling.RollingFileAppender">
    <param name="encoding" value="UTF-8" />
    <param name="append" value="true" />
    <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
        <param name="FileNamePattern" value="${catalina.home}/logs/MY-APP/%d{yyyyMMdd}/MY-APP_%d{yyyyMMddHHmmss}.log" />
    </rollingPolicy>
    <triggeringPolicy class="org.apache.log4j.rolling.SizeBasedTriggeringPolicy">
        <param name="maxFileSize" value="50000000" />
    </triggeringPolicy>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="[%d{dd/MM/yyyy HH\:mm\:ss}] %-5p [%c.%M(),%4L] - %m%n" />
    </layout>
</appender>

上述设置的结果是日志文件未在下一天开始时滚动,但如果文件大小达到50 MB,则将滚动日志文件。

请帮忙告诉我。 m(_ _)m

3 个答案:

答案 0 :(得分:7)

有问题的xml的日常工作仅转换为log4j.properties,相当于100KB后翻转(用于测试目的):

# Root logger option
log4j.rootLogger=INFO, file

# Direct log messages to a file
log4j.appender.file=org.apache.log4j.rolling.RollingFileAppender
log4j.appender.file.RollingPolicy=org.apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.file.RollingPolicy.FileNamePattern=/path/to/logs/%d{yyyyMMdd}/myLog_%d{yyyyMMddHH}.log
log4j.appender.file.TriggeringPolicy=org.apache.log4j.rolling.SizeBasedTriggeringPolicy
log4j.appender.file.TriggeringPolicy.maxFileSize=100000
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.file.Append=true

这将创建一个带时间戳的目录(每天一个目录 - 可选),其中包含以下格式的日志(每小时一个用于测试目的 - 更改FileNamePattern以满足您的需要):

myCompanyLog_20160203的 10 30.log

myCompanyLog_20160203的 11 30.log

答案 1 :(得分:5)

启用每日滚动: class =“org.apache.log4j.DailyRollingFileAppender”

并启用最大文件大小和备份文件数

<param name="MaxFileSize" value="200MB" />  
<param name="MaxBackupIndex" value="4" />

但你不能将MaxFileSizeDailyRolling放在一起,所以你可以使用滚动文件追加器

一个例子:

<appender name="MAIN_FA" class="org.apache.log4j.RollingFileAppender">
    <param name="File" value="logs/main.log" />
    <param name="datePattern" value="'-'yyyy-MM-dd'.log'" />
    <param name="append" value="false" />
    <param name="Threshold" value="ALL" />
    <param name="MaxFileSize" value="200MB" />  
    <param name="MaxBackupIndex" value="4" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %C{6} (%F:%L) - %m%n" />
    </layout>
</appender>

或者您可以执行此操作http://wiki.apache.org/logging-log4j/DailyRollingFileAppender

答案 2 :(得分:2)

来自RollingFileAppender documentation

  

作为任何用途,RollingFileAppender实例必须同时设置RollingPolicy和TriggeringPolicy .... TimeBasedRollingPolicy同时充当RollingPolicy和   TriggeringPolicy。

因此,由于上面配置了TimeBasedRollingPolicy,因此会忽略SizeBasedTriggeringPolicy。满足您需求的唯一方法是自定义类实现。

此外,如果日志文件的大小确实很重要,您可以考虑使用automatic gzip compression来消除SizeBasedTriggeringPolicy,并且每天只让您的日志滚动。