重启时log4j翻转

时间:2012-05-08 12:10:35

标签: java log4j

我在项目中使用log4j FileAppender来收集某些结果。当我的应用程序重新启动时,我想保留以前的结果文件并开始一个新的结果文件。这可能吗?

例如:

  • 启动应用程序,将结果写入results.log
  • 申请结束
  • 重新启动应用程序,将结果写入results_1.log
  • ...

我检查了DailyRollingFileAppender,但这不是我真正需要的,因为它会在特定日期设置下自动翻转。我需要在应用程序重新启动时进行翻转。

4 个答案:

答案 0 :(得分:1)

如何让您的应用程序动态设置日志文件?您可以通过在应用程序启动时以编程方式创建文件追加程序并将其附加到当前记录器来执行此操作。

例如,以下代码将根据当前时间创建新的日志文件。例如results_1336482894.logresults_1336486780.log

    Date now = new Date();
    FileAppender myFileAppender = new FileAppender();
    myFileAppender.setName("myFileAppender");
    myFileAppender.setFile("results_" + now.getTime() + ".log");
    myFileAppender.setLayout(new PatternLayout("%d %-5p [%t]: %m%n"));
    myFileAppender.setThreshold(Level.DEBUG);
    myFileAppender.activateOptions();

    Logger myLogger = Logger.getLogger("name of your logger"); //Or use getRootLogger() instead
    myLogger.addAppender(myFileAppender);

答案 1 :(得分:1)

我通过编写自己的appender解决了这个问题:

import org.apache.log4j.RollingFileAppender;

/**
   This appender rolls over at program start.
   This is for creating a clean boundary between log data of different runs.
*/
public class RunRolledFileAppender
    extends RollingFileAppender
{
  public RunRolledFileAppender() { }

  @Override
  public void activateOptions() {
    super.activateOptions();
    super.rollOver();
  }

  @Override
  public void rollOver() { }

}

注意,必须使用难看的rollOver()禁用,因为MaxFileSize设置不起作用,并且Appender也会每10MB翻转一次,这是我不需要的。

答案 2 :(得分:0)

您可以使用ExternallyRolledFileAppenderRoller类在应用程序启动时翻转日志文件。

这是一个示例类:

import org.apache.log4j.Logger;
import org.apache.log4j.varia.Roller;
public class Test {
    private static final Logger log = Logger.getLogger(Test.class);
    public static void main(final String[] args) {
        Roller.main(new String[] {"localhost", "9999"});
        log.debug("Started application!");
    }
}

示例log4j.properties文件:

log4j.appender.file=org.apache.log4j.varia.ExternallyRolledFileAppender
log4j.appender.file.File=app.log
log4j.appender.file.Port=9999
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5p: %t: %c: %m%n
log4j.rootLogger=DEBUG, file

注意ExternallyRolledFileAppender中的警告:

  

请注意,启动器未经过身份验证。任何人都可以触发翻转。在生产环境中,建议您添加某种形式的保护以防止意外的翻转。

如果这不符合您的需求,那么创建您自己的类似Appender实现应该是微不足道的。

答案 3 :(得分:0)

Log4j2的{​​{1}}具有称为RollingFileAppender的策略。

文档说明:

  

如果日志文件早于当前JVM的启动时间并且达到或超过了最小文件大小,则OnStartupTriggeringPolicy策略将导致过渡。

OnStartupTriggeringPolicy配置示例(仅xml):

Policies

更多信息和文档: https://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender