我正在使用以下Class' 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");
请注意,我的项目是多线程的。各种线程使用相同的文件进行日志记录。这可能是一个并发问题,还是只是一个红鲱鱼!
答案 0 :(得分:3)
对您的记录器进行硬性参考。经验法则是在您的班级中使用静态最终字段。
public static final String LOGGERNAME = "project.logging";
//Pin logger in memory.
private static final Logger logger = Logger.getLogger(LOGGERNAME);
来自Logger。getLogger(String)文档:
注意:LogManager可能只保留对新创建的Logger的弱引用。重要的是要理解,如果没有对Logger的强引用,则可以随时对先前创建的具有给定名称的Logger进行垃圾收集。
当记录器被垃圾收集时,您的ConsoleHandler和FileHandler不会重新连接到新的记录器。
使用FindBugs,因为它检测到此bug pattern:
LG:由于OpenJDK中的弱引用(LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE),可能导致记录器丢失;