java - 如何删除旧的滚动 log4j2 日志,最多保留 10 个文件?

标签 java logging log4j log4j2 rollingfileappender

我想要的是:

  • 最多 10 个日志文件,总数
  • 每个日志文件,大小不超过 50MB。

因此日志文件夹永远不会超过 (50MB *10 )= 500MB。

但我的 log4j2 配置似乎没有正确完成。

发生的事情是:

  • 日志在 50 MB 后滚动
  • 但是每天最多保留 10 个日志
  • 因此日志文件夹中保存的日志文件数量没有限制(因为例如,在 2 天内,收集了 20 条 50 MB 的日志)

配置如下:

<Configuration status="WARN">
    <Appenders>
        <RollingFile name="RollingFile" fileName="log/my.log" filePattern="log/my-%d{MM-dd-yyyy}-%i.log">
          <PatternLayout>
                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
          </PatternLayout>
          <Policies>
                <OnStartupTriggeringPolicy />
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="50 MB"/>
          </Policies>
          <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="RollingFile"/>
        </Root>
    </Loggers>
</Configuration>

我做错了什么?

最佳答案

从 2.5 开始,Log4j 支持 custom Delete action在每次翻转时执行。

您可以通过以下方式控制删除哪些文件:

  1. 姓名(匹配 globregex )
  2. Age (“如果超过 14 天则删除”)
  3. 计数(“只保留最近的 3 个”)
  4. 大小(“只保留最近的文件,最大 500MB”)

以上可以组合。与其仅指定大小条件以将磁盘使用量保持在最大 500MB,不如还匹配名称,这样您就不会无意中删除不相关的文件。

需要更细粒度地控制要删除的文件的用户可以使用任何受支持的 JSR-223 脚本语言指定脚本条件。

请查看documentation , 它有三个可能有用的完整示例。

对于您的问题,此代码段可能有效:

  <DefaultRolloverStrategy>
    <!--
      * only files in the log folder, no sub folders
      * only rolled over log files (name match)
      * either when more than 10 matching files exist or when the max disk usage is exceeded
    -->
    <Delete basePath="log" maxDepth="1">
      <IfFileName glob="my-??-??-????-*.log">
        <IfAny>
          <IfAccumulatedFileSize exceeds="500 MB" />
          <IfAccumulatedFileCount exceeds="10" />
        </IfAny>
      </IfFileName>
    </Delete>
  </DefaultRolloverStrategy>

顺便说一句,请注意您可以 compress log files on rollover使它们占用更少的磁盘空间。

最后,小心!无法恢复以这种方式删除的文件。 :-)

关于java - 如何删除旧的滚动 log4j2 日志,最多保留 10 个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34692415/

相关文章:

java - log4j INFO 级别不记录信息

grails - 自定义包日志级别被忽略

Java 旋转矩阵和 OBB

c# - .Net Logger(编写自己的 vs log4net/enterprise logger/nlog 等)

java - 未使用 log4j.properties 文件中提供的日志模式

ruby-on-rails - 将用户 ID 添加到 Rails 中的所有日志消息

java - 当值为 null 时,Log4j 打印 json 键名

java - 跨Web方法+java的对象

java - 如何使用 lambda 和流避免此映射的嵌套循环

java - 如何在java中存储有变音符号的字符串