对于使用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
配置此类行为?如果没有,你知道另一种优雅的解决方案吗?
答案 0 :(得分:54)
我假设您正在使用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
答案 1 :(得分:26)
您可以在单独的脚本中执行内务管理,该脚本可以每天运行。像这样:
find /path/to/logs -type f -mtime +7 -exec rm -f {} \;
答案 2 :(得分:15)
根据以下帖子,您无法使用log4j执行此操作:Use MaxBackupIndex in DailyRollingFileAppender -log4j
据我所知,这个功能应该会变成log4j 2.0,但是这个功能却被牵制了下来。根据logback网站,logback是log4j的预期后继者,因此您可以考虑使用它。
有一个名为SLF4J的API,它为日志记录提供了一个通用的API。它将在运行时加载实际的日志记录实现,因此根据您提供的配置,它可能使用java.util.log或log4j或logback或任何其他能够提供日志记录功能的库。从使用log4j到使用SLF4J会有一些前期工作,但它们提供了一些工具来自动化这个过程。将代码转换为使用SLF4J后,切换日志后端应该只是更改配置文件的情况。
答案 3 :(得分:6)
log2j现在支持删除旧日志。查看DefaultRolloverStrategy标记,并在下面的代码段中查看。它在同一天创建最多10个档案,将解析你在最大深度为2的属性标签下定义的$ {baseDir}目录,其中日志文件名匹配" 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>
答案 4 :(得分:4)
还有DailyRollingFileAppender; http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/DailyRollingFileAppender.html
编辑: 看完这个令人担忧的陈述之后;
已观察到DailyRollingFileAppender显示同步 问题和数据丢失。 log4j extras伴侣包括替代品 这应该考虑用于新部署并进行讨论 在org.apache.log4j.rolling.RollingFileAppender的文档中。
从上面的网址(我以前从未意识到),这看起来更好; http://logging.apache.org/log4j/companions/extras/apidocs/index.html
答案 5 :(得分:3)
还有另一个选项 DailyRollingFileAppender 。但它没有你想要的自动删除(保持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 的内容,它结合了 RollingFileAppender (maxSizeRollBackups,备份文件的编号)和 DailyRollingFileAppender (逐日滚动)。
但是没试过,似乎不是标准的1.2分支log4j功能。
答案 6 :(得分:3)
我遇到了这个你想要的appender here,它可以被配置为保留按日期滚动的特定数量的文件。
下载:http://www.simonsite.org.uk/download.htm
示例(groovy):
new TimeAndSizeRollingAppender(name: 'timeAndSizeRollingAppender',
file: 'logs/app.log', datePattern: '.yyyy-MM-dd',
maxRollFileCount: 7, compressionAlgorithm: 'GZ',
compressionMinQueueSize: 2,
layout: pattern(conversionPattern: "%d [%t] %-5p %c{2} %x - %m%n"))
答案 7 :(得分:2)
使用log4j.appender.FILE.RollingPolicy.FileNamePattern
设置,例如log4j.appender.FILE.RollingPolicy.FileNamePattern=F:/logs/filename.log.%d{dd}.gz
用于在滚动前一个月保存日志。
我没等一个月检查,但我尝试了mm(即分钟)并确认它覆盖了,所以我假设它适用于所有模式。
答案 8 :(得分:1)
如果您使用的是Linux,则可以使用tmpwatch配置cron作业。
大多数Linux系统都有一个tmpwatch cron作业来清理/ tmp目录。您可以添加另一个监视日志记录目录并删除超过7天的文件。
如果您使用的是其他系统,则可能存在等效的实用程序。
答案 9 :(得分:0)
尽管启动了一个chrone作业,但对于任务,我们可以在logstash的config文件夹中使用log4j2.properties文件。看看下面的链接,这将有所帮助。
答案 10 :(得分:0)
我的脚本基于@dogbane的答案
/etc/cron.daily/hbase
#!/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 {} ";"
/etc/cron.daily/tomcat
#!/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 {} ";"
因为Tomcat轮换需要一天的延迟。
答案 11 :(得分:-1)
班级DailyRollingFileAppender
使用 DatePattern 选项指定滚动计划。此模式应遵循标准中的SimpleDateFormat
约定。埃德。 6上即可。因此,我们必须使用E
选项(星期几)。例如:
<param name="DatePattern" value="'.'EEE"/>
详细了解DailyRollingFileAppender
javadoc here中的log4j
课程。遗憾的是,Java 1.4.2文档不再在线,但您可以下载副本here。
答案 12 :(得分:-1)
我已经设定了:
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender log4j.appender.R.DatePattern='.'yyyy-MM-dd # Archive log files (Keep one year of daily files) log4j.appender.R.MaxBackupIndex=367
与我之前的其他人一样,DEBUG选项向我显示错误:
log4j:WARN中没有此类属性[maxBackupIndex] org.apache.log4j.DailyRollingFileAppender。
这是一个我还没有尝试过的想法,假设我设置了DatePattern,使文件在所需的时间段后相互覆盖。为了保留一年的价值,我可以尝试设置:
log4j.appender.R.DatePattern='.'MM-dd
它会起作用还是会导致错误? 就像这需要一年才能找到,我可以试试:
log4j.appender.R.DatePattern='.'dd
但仍需要一个月才能找到答案。
答案 13 :(得分:-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();
}
}