Java 如何将log4j配置为仅保留过去七天的日志文件?
使用Java 如何将log4j配置为仅保留过去七天的日志文件?,java,logging,log4j,Java,Logging,Log4j,使用log4j进行日志记录的几个Java应用程序存在以下日志记录问题: 我希望日志文件每天轮换,如 log.2010-09-10 log.2010-09-09 log.2010-09-08 log.2010-09-07 log.2010-09-06 log.2010-09-05 log.2010-09-04 但出于数据安全原因,我们不允许在我的公司保存日志文件超过七天。因此,生成下一个日志文件log.2010-09-11应触发删除log.2010-09-04。是否可以使用log4j配置这种行为
log4j
进行日志记录的几个Java应用程序存在以下日志记录问题:
我希望日志文件每天轮换,如
log.2010-09-10
log.2010-09-09
log.2010-09-08
log.2010-09-07
log.2010-09-06
log.2010-09-05
log.2010-09-04
但出于数据安全原因,我们不允许在我的公司保存日志文件超过七天。因此,生成下一个日志文件
log.2010-09-11
应触发删除log.2010-09-04
。是否可以使用log4j
配置这种行为?如果没有,您知道解决此类日志记录问题的另一种优雅解决方案吗?我假设您使用的是RollingFileAppender?在这种情况下,它有一个名为MaxBackupIndex
的属性,您可以设置该属性来限制文件的数量。例如:
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=7
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
<param name="DatePattern" value="'.'EEE"/>
还有一个
编辑:读了这句令人担忧的话后:
已观察到DailRollingFileAppender显示同步
问题和数据丢失。log4j extras companion包括备选方案
新部署时应考虑哪些方面,哪些方面需要讨论
在org.apache.log4j.rolling.RollingFileAppender的文档中
从上面的URL(我以前从未意识到)来看,使用log4j似乎是一个更好的选择。根据下面的帖子,使用log4j无法做到这一点: 据我所知,这个功能本来应该加入到log4j2.0中,但这一努力被搁置了。根据回溯网站,LogLogic是Log4J的继任者,所以你可以考虑使用它。
有一个名为SLF4J的API,它为日志记录提供了一个通用API。它将在运行时加载实际的日志记录实现,因此根据您提供的配置,它可能会使用java.util.log或log4j或logback或任何其他能够提供日志记录功能的库。从直接使用log4j到使用SLF4J还有一些前期工作要做,但是他们提供了一些工具来自动化这个过程。一旦您将代码转换为使用SLF4J,切换日志后端只需更改配置文件即可。还有另一个选项dailrollingfileappender。但是它缺少你想要的自动删除(保留7天日志)功能 样品
log4j.appender.DRF=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRF.File=example.log
log4j.appender.DRF.DatePattern='.'yyyy-MM-dd
我确实遇到了一个叫做org.apache.log4j.CompositeRollingAppender的东西,它结合了滚动文件追加器(maxSizeRollBackups,备份文件的数量)和dailrollingfileappender的功能
但是还没有尝试过,这似乎不是标准的1.2 branch log4j功能。如果您使用的是Linux,您可以使用tmpwatch配置cron作业 大多数Linux系统都有一个清理/tmp目录的tmpwatch cron作业。您可以添加另一个监视日志目录并删除超过7天的文件
如果您使用的是不同的系统,则可能有等效的实用程序。您可以在单独的脚本中执行内务管理,该脚本可以cronned每天运行。大概是这样的:
find /path/to/logs -type f -mtime +7 -exec rm -f {} \;
<DefaultRolloverStrategy>
<Delete basePath="${baseDir}" testMode="true">
<IfFileName glob="*.log" />
<IfLastModified age="7d" />
</Delete>
</DefaultRolloverStrategy>
类
dailrollingfileappender
使用DatePattern选项指定滚动计划。此模式应遵循标准版v1.4.2
中的SimpleDateFormat
约定。因此,我们必须使用E
选项(一周中的一天)。例如:
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=7
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
<param name="DatePattern" value="'.'EEE"/>
请参阅
log4j
javadoc中有关dailrollingfileappender
类的更多信息。不幸的是,Java 1.4.2文档不再联机,但您可以下载副本。我创建了此方法,并通过关闭应用程序来调用它:
public void deleteFiles(){
File f = new File("log");
File[] fileArray = f.listFiles();
double timenow = System.currentTimeMillis();
double olderTenDays = timenow - 864000000;// MS for ten days
for (int i = 0; i < fileArray.length; i++) {
if(fileArray[i].lastModified()< olderTenDays )
fileArray[i].delete();
}
}
public void deleteFiles(){
文件f=新文件(“日志”);
File[]fileArray=f.listFiles();
double timenow=System.currentTimeMillis();
double olderTenDays=timenow-864000000;//十天毫秒
for(int i=0;i
我遇到了这个appender,它可以满足您的需要,它可以配置为保留按日期滚动的特定数量的文件
下载:
示例(groovy):
我已经设定了:
与我之前的其他人一样,调试选项向我显示了错误:
log4j:警告中没有此类属性[maxBackupIndex]
org.apache.log4j.dailrollingfileappender
这里有一个我还没有尝试过的想法,假设我设置了DatePattern,使文件在所需的时间段后相互覆盖。为了保持一年的价值,我可以尝试设置:
它会工作还是会导致错误?
如果这样的话,需要一年的时间才能找到答案,我可以试试:
但是仍然需要一个月才能找到答案。使用设置
log4j.appender.FILE.RollingPolicy.FileNamePattern
,例如log4j.appender.FILE.RollingPolicy.FileNamePattern=F:/logs/filename.log.%d{dd}.gz
在滚动前一个月保存日志
我没有等待一个月来检查,但我尝试了mm(即分钟),并确认它会覆盖,因此我假设它适用于所有模式。log2j现在支持删除旧日志 看看DefaultRolloverStrategy标签和下面的一个片段 它
- 在同一天创建最多10个存档
- 将解析在Properties标记下定义的${baseDir}目录,最大深度为2,日志文件名匹配“app-*.log.gz”
- 删除超过7天的日志,但如果最近的5个日志超过7天,则保留最近的5个日志
<DefaultRolloverStrategy max="10"> <Delete basePath="${baseDir}" maxDepth="2"> <IfFileName glob="*/app-*.log.gz"> <IfLastModified age="7d"> <IfAny> <IfAccumulatedFileCount exceeds="5" /> </IfAny> </IfLastModified> </IfFileName> </Delete> </DefaultRolloverStrategy>
<Configuration status="trace">
并使用testMode选项,如下所示:
find /path/to/logs -type f -mtime +7 -exec rm -f {} \;
<DefaultRolloverStrategy>
<Delete basePath="${baseDir}" testMode="true">
<IfFileName glob="*.log" />
<IfLastModified age="7d" />
</Delete>
</DefaultRolloverStrategy>
您可以在控制台日志中看到
#!/bin/sh
find /var/log/hbase -type f -name "phoenix-hbase-server.log.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" -exec bzip2 {} ";"
find /var/log/hbase -type f -regex ".*.out.[0-9][0-9]?" -exec bzip2 {} ";"
find /var/log/hbase -type f -mtime +7 -name "*.bz2" -exec rm -f {} ";"
#!/bin/sh
find /opt/tomcat/log/ -type f -mtime +1 -name "*.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].*log" -exec bzip2 {} ";"
find /opt/tomcat/log/ -type f -mtime +1 -name "*.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9].txt" -exec bzip2 {} ";"
find /opt/tomcat/log/ -type f -mtime +7 -name "*.bz2" -exec rm -f {} ";"