我为单例记录器类创建了以下包装器,以便我可以记录来自任何文件和/或类的异常。我的灵感来自这里:Logging to one file from multiple java files
我是 java 新手,这是我第一次尝试将异常记录到文件中。虽然以下代码确实有效,但我注意到一些怪癖,我想询问它们是否是“正常行为”或者是否存在解决方法。
(1) 创建日志文件并在异常情况下写入后,如果我编辑日志文件(例如删除某些文本行),则从那一刻起该日志文件将不再写入。在再次写入日志文件之前,Web 服务器需要重新启动与 Web 应用程序关联的域。这是正常的吗?理想情况下,我希望在日志文件中仅保留相关错误,并删除不相关的错误,而不需要在 Web 服务器中重新启动 Web 应用程序的域。
(2) 如果我删除日志文件,那么稍后 java 程序中会发生异常,日志文件不会再次创建,并且异常会丢失。同样,在创建新的日志文件之前,Web 服务器需要重新启动与 Web 应用程序关联的域。这是正常的吗?或者是否可以通过编辑以下代码来解决此问题?理想情况下,我希望能够随时删除日志文件并让应用程序创建一个新文件。
再说一遍,我是新来的,所以请随时指出上述意图是糟糕的设计等。
------代码如下------
这是文件:LoggerWrapper.java
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.logging.Logger;
import java.util.logging.Level;
import java.util.logging.FileHandler;
import java.util.logging.SimpleFormatter;
public class LoggerWrapper {
public static final Logger myLogger = Logger.getLogger("Test");
private static LoggerWrapper instance = null;
public static LoggerWrapper getInstance() {
if(instance == null) {
prepareLogger();
instance = new LoggerWrapper ();
}
return instance;
}
private static void prepareLogger() {
try {
FileHandler myFileHandler = new FileHandler("/path/to/myLogFile.log", true);
myFileHandler.setFormatter(new SimpleFormatter());
myLogger.addHandler(myFileHandler);
myLogger.setUseParentHandlers(false);
myLogger.setLevel(Level.ALL);
} catch (Exception e) {
...
}
}
}
要在不同的文件或类中调用上述代码,请发出以下行(例如):
LoggerWrapper loggerWrapper = LoggerWrapper.getInstance();
...
loggerWrapper.myLogger.log(Level.SEVERE, "some text here"+e.fillInStackTrace());
最佳答案
您不需要在日志记录方面遇到所有这些麻烦。日志处理程序(以及所有替代方案,如 logback、log4j)或像 Commons Logging 或 slf4j 这样的包装框架将为您完成几乎所有这些工作。
最广泛接受的使用日志记录的方法是使用包装器系统(slf4j 非常流行),然后将日志类作为每个类的私有(private)静态属性包含在内。然后,您可以使用单独的程序完成所有配置,也可以使用配置文件来为您设置所有内容。
如果您想在代码中设置日志系统(不是我的方式,但您可以...),请在您知道会相对较早加载的静态初始化程序中执行此操作。一旦日志系统获得其信息,就不需要再次配置。
关于Java:用于保存基本 JDK 日志文件的单例类的正确行为是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10987914/