Файл журнала не обновляется через несколько секунд при использовании Logger и FileHandler Class of Java.util

Я использую следующий класс 'LoggerUtil' для входа в консоль и в файл 'logfile.log'. Запись в консоль работает нормально. Однако запись в файл 'logfile.log' прекращается после нескольких журналов. Любые предложения по обнаружению ошибки будут приветствоваться. Я прилагаю код ниже:

public class LoggerUtil {   
  public static final String LOGGERNAME = "project.logging";

  static {
      try {
          Logger.getLogger(LOGGERNAME).setUseParentHandlers(false);
          Handler ch = new ConsoleHandler();
          Handler fh = new FileHandler("logfile.log");
          SimpleFormatter sf = new SimpleFormatter();
          fh.setFormatter(sf);
          Logger.getLogger(LOGGERNAME).addHandler(ch);
          Logger.getLogger(LOGGERNAME).addHandler(fh);
          setHandlersLevel(Level.ALL);
      } catch (IOException | SecurityException ex) {
          Logger.getLogger(LoggerUtil.class.getName()).log(Level.SEVERE, null, ex);
      }
  }

  public static void setHandlersLevel(Level level) {
      Handler[] handlers = Logger.getLogger(LOGGERNAME).getHandlers();
      for (Handler h : handlers) {
          h.setLevel(level);
      }
      Logger.getLogger(LOGGERNAME).setLevel(level);
  }

  public static Logger getLogger() {
      return Logger.getLogger(LOGGERNAME);
  }
}

Я вызываю следующий код из разных мест в моем проекте для входа:

LoggerUtil.getLogger().log(Level.INFO, "Message to be logged");

Пожалуйста, обратите внимание, мой проект многопоточный. Различные потоки используют один и тот же файл для регистрации. Может ли это быть проблемой параллелизма или это просто красная сельдь?

1 ответ

Решение

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

public static final String LOGGERNAME = "project.logging";
//Pin logger in memory.
private static final Logger logger = Logger.getLogger(LOGGERNAME);

Из регистратора. Документация getLogger(String):

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

Когда регистратор является мусором, ваши ConsoleHandler и FileHandler не присоединяются к новому регистратору.

Используйте FindBugs, потому что он обнаруживает этот шаблон ошибки:

LG: Потерянные изменения регистратора из-за слабой ссылки в OpenJDK (LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE)

Другие вопросы по тегам