Как принудительно записать Log4j в новый файл при переименовании существующего

#log4j

#log4j

Вопрос:

У меня есть Java-приложение, которое использует Log4j 1.2.17 и работает в системе Debian. Я использую механизм регистрации Linux для периодического переименования файлов журналов. Но Log4j продолжает записывать в переименованный файл, но не создает новый для записи. (Возможно, он сохраняет дескриптор файла). Мой вопрос заключается в следующем: как расширить log4j для добавления такой новой функциональности — записи в новый файл при переименовании существующего.

Спасибо,

Саймон

Ответ №1:

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

     protected void checkLogFile(){
        Enumeration<?> e = Logger.getRootLogger().getAllAppenders();
        while (e.hasMoreElements()) {
            Appender appender = (Appender) e.nextElement();
            if (FileAppender.class.isInstance(appender)) {
                FileAppender fa = (FileAppender) appender;
                String fileName = fa.getFile();
                File logFile = new File(fileName).getAbsoluteFile();
                logger.debug("check logFile = "   logFile);
                if (!logFile.exists()) {
                    logger.debug("logFile is not exist. create a new log file: "   fileName);
                    fa.setFile(fileName);
                    fa.activateOptions();
                }
            }
        }
    }
  

Пожалуйста, обратите внимание, что исходный файл журнала определяется в конфигурации log4j по относительному пути (например, ‘../log/proc.log’)