【问题标题】:Issue with filename in log4j2 rolling file appenderlog4j2 滚动文件附加程序中的文件名问题
【发布时间】:2021-07-05 03:54:44
【问题描述】:

我有以下 log4j2.xml 配置。我有一个基于时间和大小的触发策略。由于首先违反了大小限制 (10 MB),因此日志文件会翻转,并且在创建新文件时,它会在文件名中附加错误的日期。我想要的是:

  • 当文件大小达到 10 MB 时翻转(所有文件的总大小不应超过 1500 乘以 10 MB)
  • 每 15 天滚动一次

文件名应为 abc.log、abc__2021-04-09__1.log、abc__2021-04-09__2.log。基本上它应该附加当前日期。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <RollingFile name="RollingFileAppender" fileName="/var/log/abc/abc.log"
                     filePattern="/var/log/abc/abc__%d{yyyy-MM-dd}__%i.log" immediateFlush="false" append="true">
            <JsonLayout complete="true" compact="true" eventEol="true">
                <KeyValuePair key="timestamp" value="$${date:yyyy-MM-dd'T'HH:mm:ss.SSSZ}"/>
            </JsonLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="15"/>
                <SizeBasedTriggeringPolicy size="10 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="1500"/>
        </RollingFile>
    </Appenders>
 
    <Loggers>
        <Root level="info" includeLocation="false">
            <AppenderRef ref="RollingFileAppender"/>
        </Root>
    </Loggers>
</Configuration>

请让我知道我的代码哪里错了。提前致谢。

新编辑

要求 - 以 1) 或 2) 中较早发生的为准:

  1. 当所有文件的总大小超过 1500 乘以 10 MB ~ 15 GB(文件大小为 10 MB)时
  2. 自服务开始后每 15 天

如果 1) 发生在 2) 之前,它应该根据记录的速度一个一个地刷新文件的现有内容,并写入带有当前日期附加到文件名的文件(不是服务启动的日期) .

如果 2) 发生早于 1),它应该删除所有现有文件并开始写入文件名附加当前日期(不是服务启动日期)的文件。

请帮助正确配置。

【问题讨论】:

  • 文件名后面的日期是什么
  • 未来 15 天的日期...我认为它与 interval=15 有关。
  • 是,删除间隔,将当前日期附加到文件名
  • 但是如何确保每 15 天滚动一次文件?

标签: java xml log4j2 appender rollingfileappender


【解决方案1】:

您可以使用 cron 每 15 天翻转一次

<CronTriggeringPolicy schedule="30 15 */15 * * "/> 

【讨论】:

  • 你能解释一下吗?有了这个,我不需要 TimeBasedTriggeringPolicy?另外,CronTriggeringPolicy 可以和 SizeBasedTriggeringPolicy 共存吗?
  • 使用这个 cron 触发器,您不需要基于时间的触发器。它可以与基于大小的触发策略共存
  • 好的。这个'schedule="30 15 */15 * *"/'有什么作用?
  • 唯一的区别是 TimeBsaedTriggeringPolicy 在记录事件时检查是否翻转。当时间到期时,它会滚动。 CronTriggeringPolicy 使用 Log4j 的内置调度程序来导致在指定时间发生翻转事件,无论是否记录了任何事件。简而言之,切换策略不会解决您遇到的问题。使用 CronTriggeringPolicy 效果更好,当您通常在系统运行缓慢且没有 mcuh 日志记录触发翻转时进行翻转。搜索 Cron 表达式以了解语法。
【解决方案2】:

RollingFileAppender 使用文件模式中的日期模式来确定翻转的频率。由于粒度为 1 天,这通常表明它应该每天翻转。然后,您添加了 interval=15,因此已将其指示为每 15 天翻转一次。滚动文件的日期将始终是最后一次基于时间的滚动的日期。当您添加基于大小的触发策略时,您表示在该时间窗口内可能会有进一步的翻转。您应该将文件视为一个基于时间的翻转,它会被基于大小的翻转周期性地中断,因此所有这些都会增加索引上的计数器。

max 参数表示您希望在 15 天窗口内允许 1500 个文件,而不是总共 1500 个文件的限制。

如果您希望文件名中的日期每天更改,那么您需要使用 1 的间隔。

如果您想将总文件数限制为 1500 个,则需要在翻转策略中添加删除操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2023-04-05
    • 1970-01-01
    • 2013-01-29
    相关资源
    最近更新 更多