【问题标题】:How to control log file with daily rolling and max file size by log4j?如何通过 log4j 控制每日滚动和最大文件大小的日志文件?
【发布时间】:2011-11-03 11:21:05
【问题描述】:

我想创建可以在第二天开始滚动的日志文件,或者如果它达到指定的文件大小并且日志文件必须包含在日期文件夹中。 文件夹格式为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

【问题讨论】:

  • 您找到解决方案了吗?

标签: log4j rollingfileappender


【解决方案1】:

Daily 对我有用,有问题的 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_201602031030.log

myCompanyLog_201602031130.log

【讨论】:

    【解决方案2】:

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

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

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

    但是你不能把MaxFileSizeDailyRolling放在一起,所以你可以使用rolling file appender

    一个例子:

    <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

    【讨论】:

      【解决方案3】:

      来自 RollingFileAppender documentation

      为了有任何用途,RollingFileAppender 实例必须同时设置 RollingPolicy 和 TriggeringPolicy.... TimeBasedRollingPolicy 同时充当 RollingPolicy 和 触发策略。

      因此,您的 SizeBasedTriggeringPolicy 将被忽略,因为上面配置了 TimeBasedRollingPolicy。满足您的要求的唯一方法是自定义类实现。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 2013-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多