【问题标题】:log4j - DailyRollingFileAppender, file not roll hourlylog4j - DailyRollingFileAppender,文件不是每小时滚动一次
【发布时间】:2013-04-10 22:42:09
【问题描述】:

我有以下简单的 DailyRollingFileAppender 测试类,用于每小时滚动一次日志文件。我面临的问题是,即使我已将其设置为'.'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);
    } 
  }
}

【问题讨论】:

    标签: log4j


    【解决方案1】:

    使用@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");
        }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      您是否在控制台上看到任何错误??

      可能的错误原因是,您尝试多次运行同一个程序,但没有结束之前启动的程序,导致文件访问权限问题。

      【讨论】:

      • 好吧,我在这里看到了 log4j 的行为,如果一个小时后没有记录活动,它不会将日志文件重命名为 TestOrig.log.2011-10-14-14。只有当我关闭应用程序并再次启动时,它才会创建该文件。如果没有发生日志事件,有什么方法可以强制它创建 TestOrig.log.2011-10-14-14?
      • 不,只要下一个 logevent 到达它就会翻转,并且在记录时它会检查是否是翻转的时间。有关详细信息,请参阅 DailyLogAppender 中 subAppend(LoggingEvent event) 的 Javadoc。跨度>
      【解决方案3】:

      迈克,您在上面的评论中是正确的。除非在此期间有日志记录活动,否则您不会获得新文件。如果您需要强制执行该问题,则需要启动一个可运行的线程,该线程在每个新小时开始后向日志中发布一行。

      目标是每 59.5 分钟在您的日志中发布一篇文章,从第 1 分钟开始。

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

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

      Runnable的run()方法可以

      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) { 
              }
          }
      }
      

      记得在启动Thread之前将isAlive设置为true,在关机或错误/异常关闭时将其设置为false,并在设置为@后调用线程的interrupt()方法987654337@。这应该每小时记录一次。

      【讨论】:

      • 您好 Fred,感谢您澄清事实。您能否提供一个示例,说明如何执行此可运行线程以检查每个新小时并触发日志记录事件,因为我对 log4j 非常陌生。提前致谢。
      • @mike - 需要有关如何使用 Runnable 和 Thread 的基本标准知识。假设您在标准应用程序中而不是在托管服务器环境中运行,(1) 创建一个实现 Runnable 的类,(2) 使用 while 循环将 run() 方法覆盖为 true 布尔值,您可以在以下情况下将其标记为 false您的应用程序关闭,并在循环期间调用静态 Logger logger = Logger.getLogger(YourClassName.class) 的 info("Logger Text") 方法,循环等待时间为 59 分钟。把runnable扔进一个新线程,启动应用时启动线程。
      • 回答需要线程使用知识而不是 log4j 知识;目标是每 59.5 分钟在您的日志中发布一篇文章。 Runnable 的 run() 方法可以是 'public void run() { while (staticBooleanAppIsAlive) { try { staticLogger.info("Rollover Log Text"); Thread.currentThread().sleep(1000 * 60 * 59.5); // 59.5 分钟 } catch (InterruptedException e) { } } }' 记得设置 staticBooleanAppIsAlive 并在应用关闭时调用线程的 interrupt() 方法。这每小时记录一次;自己做实验,找出睡眠时间。
      • @mike - 编辑了我的答案以包括 cmets。
      猜你喜欢
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多