log4j - DailyRollingFileAppender, файл не катится каждый час - PullRequest
3 голосов
/ 14 октября 2011

У меня есть следующий простой класс Test для 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);
    } 
  }
}

Ответы [ 3 ]

0 голосов
/ 17 октября 2011

Майк, ты прав в своем комментарии выше. Вы не получите новый файл, если в течение этого времени не ведется регистрация. Если вам необходимо устранить проблему, вам нужно запустить поток с исполняемым файлом, который отправляет строку в журнал после начала каждого нового часа.

Цель состоит в том, чтобы делать один пост в вашем журнале каждые 59,5 минут, начиная с минуты 1.

Базовые стандартные знания о том, как использовать Runnable и Thread, необходимы для его решения. Я предполагаю, что вы работаете со стандартным приложением, а не в среде управляемого сервера

  1. создать класс, который реализует Runnable
  2. перезаписывает метод run() с помощью цикла while на логическую переменную true (isAlive), которую ваше приложение может установить на false, когда приложение закрывается.
  3. во время цикла вызовите метод .info("Logger Text") для static Logger logger = Logger.getLogger(YourClassName.class); с временем ожидания цикла 60 минут.
  4. Бросить Runnable в new Thread() объект при запуске приложения
  5. сделать одну info() запись в ваш лог при запуске.
  6. запускать объект потока при запуске приложения.

Run () метод Runnable может быть

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, установить его на false при завершении работы или закрытии ошибки / исключения, и вызвать метод interrupt() вашего потока после установки на false. Это должно войти один раз в час.

0 голосов
/ 10 апреля 2013

Используйте @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");
    }
}
0 голосов
/ 14 октября 2011

Я не вижу здесь никакой ошибки.Я мог видеть, что это создает файлы, когда я пытался в течение нескольких минут.

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

Вы видели какую-либо ошибку на консоли ??

Возможная причина ошибки для вас может быть, вы пытаетесьзапускать одну и ту же программу несколько раз, не завершая ранее запущенную программу, что приводит к проблеме с правами доступа к файлу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...