gpt4 book ai didi

java - 如何在 Java 中记录异常

转载 作者:行者123 更新时间:2023-12-01 15:49:31 24 4
gpt4 key购买 nike

我正在运行一个复杂的多线程 Java 应用程序,并面临一些记录异常的问题。

有一个处理异常的类 ExceptionLogger,这里是代码片段。

public class ExceptionLogger {

private enum EXTYPE {
ERROR, INFO, WARNING
}

private static Logger logger;;
private static void log(String message, EXTYPE msgtype) {

boolean append = true;
try {
FileHandler fh = new FileHandler("messages.log", append);
fh.setFormatter(new Formatter() {
@Override
public String format(LogRecord rec) {
StringBuffer buf = new StringBuffer(1000);
buf.append(new java.util.Date());
buf.append(' ');
buf.append(rec.getLevel());
buf.append(' ');
buf.append(formatMessage(rec));
buf.append('\n');
return buf.toString();
}
});
logger = Logger.getLogger("messages");
logger.addHandler(fh);

switch (msgtype) {
case WARNING:
logger.warning(message);
break;
case ERROR:
logger.severe(message);
break;
case INFO:
logger.info(message);
break;
}

} catch (IOException e) {
e.printStackTrace();
}

public static synchronized void logEx(Exception e) {
// if(e.getMessage().compareTo("Widget is disposed")==0) return;
log("Error message :" + e.getMessage(), EXTYPE.ERROR);
e.printStackTrace();
log("cause :" + e.getCause(), EXTYPE.INFO);

}


}

现在的问题是,当多个线程日志异常时,会创建多个文件,如 messages.log.1 messages.log.2 ...
即使我已将其声明为同步函数,线程不应该等待记录其异常,而不是创建新文件。

此外,e.getMessage() 的另外一件事只是让我收到诸如空指针异常之类的消息...没有对类或行号的引用。有没有。如何获得也是如此。该代码很快就会投入生产,我不能依赖 e.printStacktrace 进行调试。

最佳答案

我看到您使用java.util.logging.Logger。不要在每次调用 log 时创建 FileHandler,而是在 ExceptionLogger 的静态部分中执行此操作。并在声明时初始化记录器。

private static Logger logger = Logger.getLogger("messages");
static {
FileHandler fh = new FileHandler("messages.log", append);
fh.setFormatter(new Formatter() {
@Override
public String format(LogRecord rec) {
StringBuffer buf = new StringBuffer(1000);
buf.append(new java.util.Date());
buf.append(' ');
buf.append(rec.getLevel());
buf.append(' ');
buf.append(formatMessage(rec));
buf.append('\n');
return buf.toString();
}
});
logger = Logger.getLogger("messages");
logger.addHandler(fh);
}

然后,无需使用 log 的自定义签名,只需使用

public void log(Level level,
String msg)

用于常规消息或

public void log(Level level,
String msg,
Throwable thrown)

异常(exception)情况。

参见http://download.oracle.com/javase/6/docs/api/java/util/logging/Logger.html

还有更好的方法通过属性来配置它。

最终,您可能不需要自定义类,因为您可以直接使用 Logger。

关于java - 如何在 Java 中记录异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6400854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com