是否可以使用任何 log4j 附加程序编写具有特定轮换时间和保留限制的日志。
目标是:
- 每天都有一个日志文件;在午夜为新日志创建一个新文件
- 保留日志文件并在一定时间后自动删除它们;所以删除早于 X 天(例如 30 天)的日志文件
似乎可以进行轮换,但 log4j 无法限制保留时间
log4j 版本是 1.2。
这个 log4J 属性对我有用
log4j.rootLogger=DEBUG, stdout, file
# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# Redirect log messages to a log file, support file rolling.
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=/opt/cronjob/logs/cronlogs.log
log4j.appender.file.MaxFileSize=1028MB
log4j.appender.file.MaxBackupIndex=10
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
我的回答是基于logback
,而不是log4j
(抱歉混淆..)
您可以使用TimeBasedRollingPolicy
.
例如)
<appender name="SYSTEMLOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>./logs/system.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>./logs/system.log.%d{yyyy-MM-dd}</fileNamePattern>
<!-- keep last 30 days of logs -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %msg %n</Pattern>
</encoder>
</appender>
它将在午夜轮换,并将删除超过 30 天的日志文件。
fileNamePattern:根据 fileNamePattern 的值推断翻转周期
maxHistory:可选的 maxHistory 属性控制要保留的存档文件的最大数量,异步删除旧文件。例如,如果您指定每月翻转,并将 maxHistory 设置为 6,则将保留 6 个月的存档文件,而 6 个月之前的文件将被删除。请注意,由于旧的归档日志文件已被删除,因此为归档日志文件而创建的任何文件夹都将被适当地删除。
您可以查看有关TimeBasedRollingPolicy的更多信息
我们可以!
文件:project->src->main->resources->logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>folderName/logFile.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>folderName/archive/logFile.%d{dd-MM-yyyy}.log</fileNamePattern>
<!-- keep last 30 days of logs -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<!-- filter by level (optional) -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
</filter>
<encoder>
<pattern>%date %-5level [%thread] %file:%L [%M] - %msg%n</pattern>
</encoder>
</appender>
<!-- you can filter by type of level (optional) -->
<root level="DEBUG">
<appender-ref ref="FILE"/>
</root>
</configuration>
有关更多信息,请参阅文档:TimeBasedRollingPolicy
JavaDoc:基于时间的滚动策略
大多数答案都是基于 logback。但问题是关于 log4j 1.2(旧......)
提到 DailyRollingFileAppender 的答案也不起作用。
org.apache.log4j.DailyRollingFileAppender
不支持该MaxBackupIndex
属性请参阅http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.html(这是用于RollingFileAppender
)
您可能感兴趣: 在 DailyRollingFileAppender -log4j 中使用 MaxBackupIndex
并寻找可能的答案: Log4j Rollingpolicy and MaxbackupIndex
但是您可能应该使用 slf4j log4j“仿真”(http://www.slf4j.org/legacy.html#log4j-over-slf4j)并通过 logback 路由您的日志(无需任何代码更改),它更容易实现.