【发布时间】:2013-10-21 18:52:05
【问题描述】:
我想将 log4j 配置为只写入最大指定大小的文件,例如5MB。当日志文件达到 5MB 时,我希望它开始写入新文件。我想在日志文件名中加入某种有意义的时间戳,以区分一个文件和下一个文件。
在编写新文件时,我不需要它以任何方式重命名或操作旧文件(压缩是一个福音,但不是必须的)。
我绝对不希望它在一定时间或滚动文件数量后开始删除旧文件。
N MB 日志文件的时间戳块似乎是我能想象到的绝对基本的最小简单策略。它是如此基本,以至于我几乎拒绝相信它不是开箱即用的,但我一直无法弄清楚如何做到这一点!
特别是,我尝试了DailyRollingFileAppender、RollingFileAppender 或“Extras”RollingFileAppender 的所有化身。当超过备份计数时,所有这些都会删除旧文件。我不想要这个,我想要我所有的日志文件!
Extras 中的TimeBasedRollingPolicy 不适合,因为它没有最大文件大小选项,并且您无法关联辅助SizeBasedTriggeringPolicy(因为它已经实现了TriggeringPolicy)。
是否有开箱即用的解决方案 - 最好是 maven Central 中的解决方案?
【问题讨论】:
-
您是否考虑过使用 maxint 作为参数调用
setMaxBackupIndex,从而有效地让它永远滚动? -
@flup,这无法扩展。使用常规的
RollingFileAppender,如果您有 N 个“备份”文件,则每次滚动都需要重命名所有 N 个文件,这可能会非常慢。出于这个原因,“额外”RollingFileAppender将备份计数限制为 12。如果我可以在创建时将创建时间(或一些唯一索引 - 并不关心哪个)放入文件名中,我真的不希望或不需要它来重命名任何文件。 -
@flup 实际上比这更糟糕 - 如果你有 maxBackupIndex=N,它会尝试查找并重命名所有 N 个文件(即使它们还不存在)......所以 maxint 会绝对是不可能的!
-
你需要使用log4j吗? Logback 支持基于时间和大小的滚动文件策略,可能适合您 (logback.qos.ch/manual/appenders.html)。
-
有趣!我认为最好的解决方案是为现有的 appender 调整代码。
标签: log4j rollingfileappender fileappender