Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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 如何删除旧的滚动日志4j2,最多保留10个文件?_Java_Logging_Log4j_Log4j2_Rollingfileappender - Fatal编程技术网

Java 如何删除旧的滚动日志4j2,最多保留10个文件?

Java 如何删除旧的滚动日志4j2,最多保留10个文件?,java,logging,log4j,log4j2,rollingfileappender,Java,Logging,Log4j,Log4j2,Rollingfileappender,我想要的是: 总共最多10个日志文件 每个日志文件的大小不超过50MB 因此,logs文件夹的大小永远不会超过(50MB*10)=500MB 但是我的log4j2配置似乎没有正确完成 正在发生的是: 日志在50MB后确实会滚动 但每天最多保存10个日志 因此,日志文件夹中保存的日志文件数量没有限制(例如,在2天内,收集了20个50mb的日志) 以下是配置: <Configuration status="WARN"> <Appenders>

我想要的是:

  • 总共最多10个日志文件
  • 每个日志文件的大小不超过50MB
因此,logs文件夹的大小永远不会超过(50MB*10)=500MB

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

正在发生的是:

  • 日志在50MB后确实会滚动
  • 但每天最多保存10个日志
  • 因此,日志文件夹中保存的日志文件数量没有限制(例如,在2天内,收集了20个50mb的日志)
以下是配置:

<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>

%d%p%c{1.}[%t]%m%n

我做错了什么?

自2.5以来,Log4j支持在每次滚动时执行的

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

  • 名称(匹配a或a)
  • (“如果14天或14天以上,则删除”)
  • 计数(“仅保留最近的3个”)
  • 大小(“仅保留最新的文件,最大为500MB”)
  • 以上内容可以结合使用。与其只指定一个大小条件以将磁盘使用率降低到最大500MB,不如同时匹配名称,这样您就不会无意中删除不相关的文件

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

    请检查,它有三个完整的例子,可能是有用的

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

      <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>
    
    
    
    另一方面,请注意,您可以使它们占用更少的磁盘空间


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

    基于时间的触发策略基于
    文件模式
    工作。基本上,文件模式中的最小时间单位(
    %d
    )是触发时间间隔。在您的情况下,该值为“dd”,因此每天都会触发该策略

    在您的
    文件模式中出现%i会在一天内保留多个日志文件。
    
    我建议尝试在log4j 2.1中不使用
    %I
    文件模式

    的任何方法,而不是作为log4j函数。您需要编写脚本来删除操作系统中的旧日志……不过我强烈建议升级。您无法升级的原因是什么?唯一的原因是得到我的经理的批准:)。无论如何,我升级到了2.7。谢谢