当前位置: 首页 > 知识库问答 >
问题:

log4j2 RollingFileAppender在7次滚动后删除旧文件

西门飞星
2023-03-14

我在webapp中使用以下log4j RollingFile appender。

<Appenders>
    <RollingFile name="logFile"
                 fileName="${env:SYSTEM_LOGS}/${env:LOG_FILE_NAME}.log" immediateFlush="true"
                 filePattern="${env:SYSTEM_LOGS}/${env:LOG_FILE_NAME}.log.%d{yyyy_MM_dd.HH_mm_ss}.%i">
        <PatternLayout pattern="%d{yyyyMMdd-HHmmss.SSS}|%X{username}|%-5p|%t| %-100m (%c{1})%n"/>
        <Policies>
            <OnStartupTriggeringPolicy/>
        </Policies>
    </RollingFile>
</Appenders>

使用filePattern=“${env:system_logs}/${env:log_file_name}.log.%d{yyyy_mm_dd.hh_mm_ss}.%i”时,当日志滚动时,旧文件将重命名为具有索引号的文件名(使用%i指定),因此所有旧文件都应重命名并保留。

我通过以下代码以编程方式滚动日志。

org.apache.logging.log4j.Logger logManagerLogger = LogManager.getLogger();
Map<String, org.apache.logging.log4j.core.Appender> appenders = ((org.apache.logging.log4j.core.Logger) logManagerLogger).getAppenders();
appenders.forEach((appenderName, appender) -> {
    if (appender instanceof RollingFileAppender) {
        LOGGER.info("Switching log for appender " + appenderName);
        ((RollingFileAppender) appender).getManager().rollover();
    }
});

但是,在7次滚动之后,现有文件将被删除(未根据指定的filePattern重命名),并在新文件中继续日志。

这里有什么问题?

共有1个答案

章昆琦
2023-03-14

设置DefaultRolloverStrategy(默认值为7),则在配置中将为:

    <Appenders>
    <RollingFile name="logFile"
                 fileName="${env:SYSTEM_LOGS}/${env:LOG_FILE_NAME}.log" immediateFlush="true"
                 filePattern="${env:SYSTEM_LOGS}/${env:LOG_FILE_NAME}.log.%d{yyyy_MM_dd.HH_mm_ss}.%i">
        <PatternLayout pattern="%d{yyyyMMdd-HHmmss.SSS}|%X{username}|%-5p|%t| %-100m (%c{1})%n"/>
        <Policies>
            <OnStartupTriggeringPolicy/>
        </Policies>
        <DefaultRolloverStrategy max="100"/>
    </RollingFile>
</Appenders>

现在,它将有100个日志文件要翻转。

 类似资料:
  • 问题内容: 我知道您可以定义overflow:hidden; 在HTML主体上删除滚动条,但我仍然希望能够使用鼠标上的箭头或滚轮滚动。 在此先感谢您的帮助。 编辑:感谢您对悬停滚动条和自定义栏上的所有建议。另外,感谢您担心通过删除滚动条来影响用户体验。我会详细说明,以便您解释我的来历。 我有一个圆形页面(如果您使用滚轮或箭头按钮滚动,当到达底部时,它将重置为页面顶部并重新开始)。永无止境的循环。滚

  • 我知道你可以定义溢出:隐藏;在HTML的正文中删除滚动条,但我希望仍然能够用鼠标上的箭头或滚轮滚动。 提前感谢您的帮助。 编辑:感谢您有关悬停滚动条和自定义栏的所有建议。还要感谢您对通过删除滚动条影响用户体验的所有疑虑。我将更详细地阐述一下,以便您解释我来自哪里。 我有一个圆形页面(如果你用滚轮或箭头按钮滚动,当它到达底部时,它会重置到页面顶部并重新开始)。一个永无止境的循环。滚动条会影响这个,因

  • 问题内容: 我使用以下crontab记录来每天备份数据库: 我想添加另一个crontab记录,该记录将删除早于一个月的数据库转储。 有什么想法吗? 问题答案: 只需创建另一个cron: 它将查找所有早于30天的备份并将其删除。

  • 我阅读了log4j2的官方文档,并得到了一个关于RollingFileAppender的问题。 文件上是这么说的: 下面是一个示例配置,它使用基于时间和大小的触发策略的RollingFileAppender,将在同一天(1-100)创建多达100个存档,这些存档存储在基于当前年份和月份的目录中,并将压缩每个存档使用gzip并将每小时滚动一次。在每次翻转期间,此配置将删除与"/app.log.gz"

  • 我正在寻找一个简单的批处理脚本,它将允许我删除旧文件并记录它是否删除了旧文件。搜索完网站后,我发现“forfiles”非常有用: 来自:批处理文件以删除超过N天的文件 正如我所说,我关心的是记录已删除的内容。我尝试了很多东西,但仍然不起作用。这是我的实际代码: 日志文件已创建,但为空,旧文件不会被删除。(它应该删除我2016年的8个文件)当我使用原始代码时,它会删除文件。我可能读过关于逃离 目标是

  • 问题内容: 我发现自己想在许多应用程序中滚动删除早于(x)天的行。在交通繁忙的桌子上最有效地做到这一点的最佳方法是什么? 例如,如果我有一个存储通知的表,而我只想将其保留7天。还是我只想保留31天的高分。 现在,我继续存储存储的纪元时间,并运行一个cron作业,该作业每小时运行一次,并按如下所示增量删除它们: 我这样做直到mysql_affected_rows返回0。 我曾经一次完成所有操作,但是