我为我的应用程序编写了一个愚蠢的记录器。它将信息、警告和严重消息写入日志文件。前一段时间它工作得很好,但突然间,它无缘无故地停止工作了。 如果日志文件不存在,它会继续创建该文件,但不写入任何内容。 我找不到它现在不起作用的原因。我会感谢一些帮助。
使用 IDE 进行调试,我意识到消息已正确传递到 logger,并且 logger.info() 正在执行。
public class FsLogger {
private static FsLogger instance;
private final String filename = "Logs/LogFsForensics.log";
private final String loggerName = "FsLogger";
private static Logger logger;
private FileHandler fh;
private final int limit = 1024*10000; //10 MB
private SimpleFormatter sf;
private FsLogger() {
logger = Logger.getLogger(loggerName);
sf = new SimpleFormatter();
try {
fh = new FileHandler(filename, limit, 1, true);
sf = new SimpleFormatter();
fh.setFormatter(sf);
logger.addHandler(fh);
} catch (SecurityException | IOException e) {
e.printStackTrace();
}
}
public static FsLogger getInstance() {
if(instance == null) {
instance = new FsLogger();
}
return instance;
}
public void info(String message) {
logger.info(message);
}
public void warning(String message) {
logger.warning(message);
}
public void severe(String message) {
logger.severe(message);
}
记录器调用示例:
private FsLogger logger = FsLogger.getInstance();
logger.severe(e1.getMessage());
从代码中您使用的相对路径为
Logs/LogFsForensics.log
,这意味着如果进程的当前工作目录发生更改,则路径将无效。当发生这种情况时,FileHandler 将在默认位置创建一个文件。使用绝对路径或指定 FileHandler 特殊组件之一。例如:
/Logs/LogFsForensics.log
作为绝对路径或 %h/Logs/LogFsForensics.log
作为主目录的相对路径。
您可以从记录不显示修改测试程序以打印记录器树和处理程序。可能级别设置不正确或未安装处理程序。
查看代码,我认为您希望
getInstance
同步,这样您就不会尝试创建多个处理程序。
我尝试执行您的代码并在控制台和文件中获得以下输出:
May 30, 2019 12:35:11 PM io.yooksi.Main main
INFO: This is a test.
May 30, 2019 12:35:11 PM io.yooksi.FsLogger info
INFO: This is an info message
May 30, 2019 12:35:11 PM io.yooksi.FsLogger warning
WARNING: This is a warning
May 30, 2019 12:35:11 PM io.yooksi.FsLogger severe
SEVERE: This is a sever error message
这意味着您的代码没有错误,因此您可以尝试以下操作:
确保以下代码正确输出到控制台:
Logger logger = Logger.getLogger("test");
logger.info("This is a test.");
FileWriter
或 PrintWriter
手动写入文件。如果第一个测试无法将任何内容打印到控制台,请阅读以下文档,您可以在其中找到
Java
记录器无法工作的常见原因列表以及解决这些问题的具体步骤 (至少是与配置相关的步骤) :