如何使用记录器打印异常?

Posted

技术标签:

【中文标题】如何使用记录器打印异常?【英文标题】:how to print an exception using logger? 【发布时间】:2013-03-26 04:30:54 【问题描述】:

我有一种情况,我想使用记录器打印在 catch 块中捕获的所有异常。

 try 
        File file = new File("C:\\className").mkdir();
        fh = new FileHandler("C:\\className\\className.log");
        logger.addHandler(fh);
        logger.setUseParentHandlers(false);
        SimpleFormatter formatter = new SimpleFormatter();
        fh.setFormatter(formatter);
     catch (Exception e) 
        logger.info(e);
    

我得到错误记录器不能应用于java.io.Exception...

我担心的是,如果我在 try 块中做了这么多事情,而我只保留一个 catch 块作为 catch(Exception e),那么有没有办法使用记录器打印在 catch 块中捕获的任何类型的异常? 注意:我们使用的是 java.util.logging.Logger API

【问题讨论】:

***.com/a/1149718/112500 ***.com/questions/1149703/…的可能重复 通常日志文件名、格式等都留在代码之外,以便在生产中进行调整。 【参考方案1】:

您可能应该澄清您使用的是哪个记录器。

org.apache.commons.logging.Log 接口具有方法void error(Object message, Throwable t)(和方法void info(Object message, Throwable t)),它将堆栈跟踪与您的自定义消息一起记录。 Log4J 实现也有这个方法。

所以,可能你需要写:

logger.error("BOOM!", e);

如果您需要使用 INFO 级别记录它(不过,这可能是一个奇怪的用例),那么:

logger.info("Just a stack trace, nothing to worry about", e);

希望对你有帮助。

【讨论】:

@Kadelakig 抱歉,我们正在使用 java.util.looging API 哦,我明白了。似乎也有一些类似的功能:java.util.logging.Logger.getLogger("Test").log(Level.INFO, "BOOM!", e); 【参考方案2】:

使用:LOGGER.log(Level.INFO, "Got an exception.", e);LOGGER.info("Got an exception. " + e.getMessage())

【讨论】:

如果异常是意外的,那么我建议对日志消息使用严重的警告日志级别 是的,对于可能是真的意外异常。不过,我正在回答这个问题,提问者使用信息日志级别进行记录,因此我的示例使用信息。【参考方案3】:

尝试如下记录堆栈跟踪:

logger.error("Exception :: " , e);

【讨论】:

我试过这个,得到错误 Symbol not found symbol : method error(java.lang.String,java.io.IOException) location: class java.util.logging.Logger logger.error("例外:: ",e); @Pankaj 你不是在使用 Log4j 进行日志记录吗?该方法存在于org.apache.log4j.Logger【参考方案4】:

您可以使用此方法将异常堆栈记录到String

 public String stackTraceToString(Throwable e) 
    StringBuilder sb = new StringBuilder();
    for (StackTraceElement element : e.getStackTrace()) 
        sb.append(element.toString());
        sb.append("\n");
    
    return sb.toString();

【讨论】:

以上是关于如何使用记录器打印异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SLF4J 使用占位符记录异常和消息

如何从它的消息中分离异常类型

java中如何获取throws抛出的异常,并且把异常打印到指定的jsp页面

如何使用 Firebase (Crashlytics) 记录非致命(捕获)异常

如何在 .NET Core 中使用结构化参数记录异常

在 PySpark RDD 中,如何使用 foreachPartition() 打印出每个分区的第一条记录?