如何使用记录器打印异常?
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();
【讨论】:
以上是关于如何使用记录器打印异常?的主要内容,如果未能解决你的问题,请参考以下文章
java中如何获取throws抛出的异常,并且把异常打印到指定的jsp页面