java - 使用 Java.util 的 Logger 和 FileHandler 类时,几秒钟后日志文件未更新

标签 java multithreading logging

我正在使用以下类“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");

请注意,我的项目是多线程的。不同的线程使用相同的文件进行日志记录。这可能是并发问题还是只是转移注意力!

最佳答案

对您的记录器进行硬引用。经验法则是在类中使用静态最终字段。

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

来自记录器。 getLogger(String)文档:

Note: The LogManager may only retain a weak reference to the newly created Logger. It is important to understand that a previously created Logger with the given name may be garbage collected at any time if there is no strong reference to the Logger.

当记录器被垃圾收集时,您的 ConsoleHandler 和 FileHandler 不会重新附加到新记录器。

使用 FindBugs,因为它检测到此 bug pattern :

LG: Potential lost logger changes due to weak reference in OpenJDK (LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE)

关于java - 使用 Java.util 的 Logger 和 FileHandler 类时,几秒钟后日志文件未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22689831/

相关文章:

c++ - 何时创建多少个线程?

python - 未在行为步骤上捕获日志记录

java - 带保存日志的 ServerGUI - JAVA

java - 为什么 @ConfigurationProperties 类的默认值不起作用?

java - 如何查找和替换子字符串?

java - 如何限制用户根据Android中的日期选择器中的其他日期设置日期

azure - 在 Key Vault 上设置日志记录时出错日志类别 'AuditEvents' 不可用

java - 无法从 jar 加载类定义

c - 在 C 中使用线程编程时的棘手死锁

java - 如何在Java中连续检查文件是否存在? [复制]