Java:用于保存基本 JDK 日志文件的单例类的正确行为是否正确?

标签 java logging error-handling

我为单例记录器类创建了以下包装器,以便我可以记录来自任何文件和/或类的异常。我的灵感来自这里: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/

相关文章:

c++ - 如何告诉 flex 和 bison 停止处理输入?

java - ViewPager.instantiateItem() 位置

java - 如何解决TextView使用append方法无法添加新文本值的问题

java - 编码感知的 RandomAccessReader 实现?

logging - 如何以编程方式禁用Jetty 9日志记录?

c# - 用户代码未处理Dll get Exception的C#用户定义的异常处理错误

java - Openssl、Java : unable to decrypt for long messages

python - Logentries - Python 示例返回 UnicodeDecodeError

linux - 如何将进程的输出通过管道传输到 logger 命令和 head 命令?

javascript - 如何从不同域的脚本报告 JS 错误?