【问题标题】:Log4j RollingFileAppender every minuteLog4j RollingFileAppender 每分钟
【发布时间】:2016-12-02 22:45:43
【问题描述】:

我正在使用 log4j 2.6.2 测试 Log4j RollingFileAppender。

我想每分钟轮换一次日志,所以我有一个 log4j2.xml,与此处https://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender 的一个示例非常相似。 这是我的 log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="testlog4j2" packages="">
  <Properties>
    <Property name="baseDir">C:/tmp/testlog4</Property>
  </Properties>
  <Appenders>
    <RollingFile name="RollingFile" fileName="${baseDir}/app.log"
          filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH-mm}.log.gz">
      <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" />
      <CronTriggeringPolicy schedule="0 0/1 * * * ?"/>
      <DefaultRolloverStrategy>
        <Delete basePath="${baseDir}" maxDepth="2">
          <IfFileName glob="*/app-*.log.gz" />
          <IfLastModified age="60d" />
        </Delete>
      </DefaultRolloverStrategy>
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="ALL">
      <AppenderRef ref="RollingFile"/>
    </Root>
  </Loggers>
</Configuration>

这是一个我每秒写一个日志的应用程序。

package testlog4j2;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class TestLog4j {

    private final static Logger logger = LogManager.getLogger(TestLog4j.class);

    public static void main(String[] args) {
        try {
            for (int i=1; i<=240; i++) {
                logger.info("Hello");
                Thread.sleep(1*1000);
            }
        } catch (Exception e) {
            //e.printStackTrace();
            logger.error("Excepcion general", e);
        }
    }
}

会发生什么:

  • 一旦系统在第一分钟轮换日志,就会不断出现这样的错误

    2016-07-28 15:10:02,015 Log4j2-Log4j2Scheduled-1 错误无法将文件 C:\tmp\testlog4\2016-07\app-2016-07-28-15-10.log.gz 移动到C:\tmp\testlog4\2016-07\app-2016-07-28-15-10.log.gz: java.nio.file.NoSuchFileException C:\tmp\testlog4\2016-07\app-2016-07 -28-15-10.log.gz -> C:\tmp\testlog4\2016-07\app-2016-07-28-15-10.log.gz

  • 不是每分钟都有一个 gz

  • 结果 gz 没有 60 行的日志。相反,它们有 1、2 或 3 行日志。
  • 主日志C:\tmp\testlog4\app.log没有内容

我做错了什么?

谢谢

【问题讨论】:

    标签: java logging configuration log4j rollingfileappender


    【解决方案1】:

    到目前为止,它似乎可以使用 TimeBasedTriggeringPolicy 而不是 CronTriggeringPolicy。

    我的 conf 现在看起来像这样

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="warn" name="testlog4j2" packages="">
      <Properties>
        <Property name="baseDir">C:/tmp/testlog4</Property>
      </Properties>
      <Appenders>
        <RollingFile name="RollingFile" fileName="${baseDir}/app.log"
              filePattern="${baseDir}/app-%d{yyyy-MM-dd-HH-mm}.log">
          <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" />
          <!-- 
          <CronTriggeringPolicy schedule="0 0 0 * * ?"/>
          -->
          <!-- 
          <CronTriggeringPolicy schedule="0 0/1 * * * ?"/>
           -->
          <TimeBasedTriggeringPolicy interval="1"/><!-- como el filePattern tiene como unidad minima el minuto, se hara cada 1 minutos -->
          <DefaultRolloverStrategy>
            <Delete basePath="${baseDir}" maxDepth="0">
              <IfFileName glob="*/app-*.log" />
              <IfLastModified age="2M" />
            </Delete>
          </DefaultRolloverStrategy>
        </RollingFile>
      </Appenders>
      <Loggers>
        <Root level="ALL">
          <AppenderRef ref="RollingFile"/>
        </Root>
      </Loggers>
    </Configuration>
    

    删除现在不起作用,但这是我接下来要调查的另一个故事。

    最好的问候

    【讨论】:

    • 删除现在适用于这个 删除>
    【解决方案2】:

    您可能发现了一个错误。请在Jira issue tracker 上提出错误报告,并提供您在此处描述的所有详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2023-03-26
      • 2014-01-16
      • 1970-01-01
      • 2014-04-16
      • 2014-08-16
      • 1970-01-01
      相关资源
      最近更新 更多