我正在使用log4j
和log4j.extras
创建一个在两个条件下滚动的RollingFileAppender:
- 工作文件大小超过
MaxFileSize
阈值。 - 系统的日期会更改。
按照本指南,追加器需要TimeBasedRollingPolicy
和SizeBasedTriggeringpolicy
,例如:
<appender name="file_logger" class="org.apache.log4j.rolling.RollingFileAppender">
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="ActiveFileName" value="/fxh/logs/D3FIXFeeds.log" />
<param name="FileNamePattern" value="/fxh/logs/D3FIXFeeds.%d{HH-mm}.%i.log" />
</rollingPolicy>
<triggeringPolicy
class="org.apache.log4j.rolling.SizeBasedTriggeringPolicy">
<param name="MaxFileSize" value="50000" /> <!-- in bytes -->
</triggeringPolicy>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p - %m%n" />
</layout>
</appender>
如何设置日志输出总磁盘空间的最大限制? 例如,假设我们的服务器管理员为此应用程序分配了 40gb 的日志,那么在双重滚动策略下,是否可以指定此内容?
到目前为止,我找到的最接近的是maxBackupIndex
参数。 我无法让这个工作... 例如,这两种方法都不会仅截断五个文件的日志:
<appender name="file_logger" class="org.apache.log4j.rolling.RollingFileAppender">
<param name="MaxBackupIndex" value="5"/>
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="ActiveFileName" value="/fxh/logs/D3FIXFeeds.log" />
<param name="FileNamePattern" value="/fxh/logs/D3FIXFeeds.%d{HH-mm}.%i.log" />
...
也不
<appender name="file_logger" class="org.apache.log4j.rolling.RollingFileAppender">
<rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
<param name="ActiveFileName" value="/fxh/logs/D3FIXFeeds.log" />
<param name="FileNamePattern" value="/fxh/logs/D3FIXFeeds.%d{HH-mm}.%i.log" />
<param name="MaxBackupIndex" value="5"/>
...
正如@Arigion所说,看起来 log4j 不能做到你的要求,但幸运的是 Logback 可以。它提供了 SizeAndTimeBasedRollingPolicy 和 totalSizeCap,允许您创建随大小和时间滚动并遵守总存储限制的日志,如下所示:
<appender name="file_logger" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/fxh/logs/D3FIXFeeds.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>/fxh/logs/D3FIXFeeds.%d{HH-mm}.%i.log</fileNamePattern>
<maxFileSize>500KB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>40GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p - %m%n</pattern>
</encoder>
</appender>
这不是一个工作示例,因为我只是对字段使用了最佳猜测,但请告诉我它是怎么回事。
根据这篇文章,TimeBasedRollingPolicy不适用于MaxBackupIndex。
但是你可以使用TimeAndSizeRollingAppender。它具有按时间或日期滚动更新的日志文件、最大文件大小和最大备份文件数参数。
我认为没有 log4j 追加器可以观察总目录大小。在我看来,这更像是一份家政工作,而不是伐木工的工作。甚至没有 logrotate,它比日志追加器提供目录大小限制更通用。 您可以使用外部脚本(例如,由 cron 触发(来执行这样的目录清理。