Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将log4j配置为仅保留过去七天的日志文件?_Java_Logging_Log4j - Fatal编程技术网

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 {} ";"