log4j - DailyRollingFileAppender,文件不是每小时滚动一次

时间:2011-10-14 02:53:34

标签: log4j

我为DailyRollingFileAppender提供了以下简单的Test类来每小时滚动日志文件。我面临的问题是,它似乎并没有每小时翻转到新的日志文件,即使我已经设置为'。'yyyy-MM-dd-HH。知道我在错误的代码中的位置吗?

public class Test {
  static Logger logger = Logger.getLogger(Test.class);

  public static void main(String args[]) throws Exception {
      String pattern = "%-20d{dd MMM yyyy HH:mm:ss} [%-5p] - %m%n";

    PatternLayout patternLayout = new PatternLayout(pattern);  

    //CREATE APPENDER.       
    DailyRollingFileAppender myAppender = new DailyRollingFileAppender(patternLayout, "TestOrig.log", "'.'yyyy-MM-dd-HH");

    //ADD APPENDER & LEVEL.
    logger.addAppender(myAppender);
    logger.setLevel   ((Level) Level.DEBUG);


//WRITE MESSAGES.
logger.debug("Successful");
logger.info ("Failed" );
logger.warn ("Failed" );
logger.error("Successful");
logger.fatal("Failed"); 

    while(true)
    {           
        Thread.sleep(1000);
    } 
  }
}

3 个答案:

答案 0 :(得分:0)

我在这里看不到任何错误。当我试着几分钟时,我可以看到这是创建文件。

DailyRollingFileAppender myAppender = new DailyRollingFileAppender(patternLayout, "TestOrig.log", "'.'yyyy-MM-dd-HH-mm");

你在控制台上看到任何错误吗?

可能的错误原因可能是,您尝试多次运行相同的程序,而不会结束以前启动的程序,这会导致文件访问权限问题。

答案 1 :(得分:0)

迈克,你在上面的评论中是正确的。除非在此期间有日志记录活动,否则您将无法获得新文件。如果您需要强制解决问题,则需要启动一个带有runnable的线程,该线程在每个新小时开始后将一行发布到日志中。

目标是从第1分钟开始每59.5分钟为您的日志发一个帖子。

他的解决方案需要有关如何使用Runnable和Thread的基本标准知识。我假设您正在运行标准应用程序而不是在受管服务器环境中

  1. 创建一个实现Runnable
  2. 的类
  3. 使用run()循环将while方法覆盖为true布尔变量(isAlive),当您的应用关闭时,您的应用可以设置为false
  4. 循环期间
  5. 调用.info("Logger Text")的{​​{1}}方法,循环等待时间为60分钟。
  6. 在应用程序启动时将static Logger logger = Logger.getLogger(YourClassName.class);投入Runnable对象
  7. 在启动时向您的日志发送一个new Thread()帖子。
  8. 启动应用程序时启动线程对象。
  9. Runnable的

    run()方法可以是

    info()

    在开始public void run() { while (isAlive) { // isAlive is a global-level (static, even) boolean // you declared earlier as true, your app should set it to false // if your app decides to exit try { logger.info("Rollover Log Text"); Thread.currentThread().sleep(1000 * 60 * 60); // 60 minutes } catch (InterruptedException ignore) { } } } 之前,请务必将isAlive设置为true,在关机或错误/异常关闭时将其设置为Thread,然后调用{{1}设置为false后线程的方法。这应该每小时记录一次。

答案 2 :(得分:0)

使用@Singleton和@Schedule为您的计时器服务创建一个类似ejb cron的计划。

import javax.ejb.Schedule;
import javax.ejb.Singleton;


@Singleton
public class Cron {
        static Logger logger = Logger.getLogger(Test.class);
    @Schedule(second="0", minute="0", hour="0", dayOfWeek="*", persistent=false)
    public void rollLogs() {
        logger.info("midnight");
    }
}