如何使用java的Logger类记录堆栈跟踪

Sur*_*eph 24 java logging stack-trace java.util.logging

我正在使用Java的Logger课程.我想通过ex.printStackTrace()进入Logger.log(loglevel, String),但printStackTrace()回报率void.所以我无法传递和打印异常的堆栈跟踪.

有什么方法可以转换voidString,或者是否有任何其他方法来打印整个堆栈的异常跟踪?

Sai*_*sif 37

你需要明白这void是实际的nothingness.你无法转换什么都不是.你可能最终打印void成一个字符串,但(相信我),你不希望这样.

我认为你在寻找的是

// assuming ex is your Exception object
logger.error(ex.getMessage(), ex);
// OR
Logger.log(errorLogLevel, ex.getMessage(), ex)
Run Code Online (Sandbox Code Playgroud)

这将使用您配置的记录器打印错误消息.有关更多详细信息,您可以查看异常#getMessage()的java文档

  • `logger.error()`不是`java.util.logging`,但我不打算投票给你,因为我很高兴发现`logger.log(Level,Exception,Supplier)`.看起来甲骨文让`java.util.logging.Logger`变得非常难看!由于他们这样做,奇怪的是他们没有进一步采取它并创建`logger.severe(String,Exception)`等 (7认同)
  • 这根本没有回答将堆栈跟踪打印到记录器的最初意图。getMessage() 不是为此而设计的。 (3认同)
  • 该问题要求使用Java的Logger类的解决方案。java.util.logging.Logger没有名为“错误”的方法。因为这个原因,我对这个答案不满意。 (2认同)
  • 所以,答案是: logger.log(Level.SEVERE, ex.getMessage(), ex); (2认同)

hzp*_*zpz 22

像这样使用java.util.logging.Logger#log(Level, String, Throwable)和传入ex第三个参数:

LOGGER.log(Level.INFO, ex.getMessage(), ex);
Run Code Online (Sandbox Code Playgroud)

  • 我没有得到堆栈跟踪来记录这个,只有第二个参数。 (2认同)
  • @PanuHaaramo这取决于您使用的格式化程序。格式化程序需要以“格式”调用“ record.getThrown()”。看看`SimpleFormatter`。 (2认同)

小智 9

另一种选择是:

import org.apache.commons.lang3.exception.ExceptionUtils;

log.error("Exception : "+ExceptionUtils.getStackTrace(exception));
Run Code Online (Sandbox Code Playgroud)

  • 如果您引用的是org.apache.commons.lang3.exception.ExceptionUtils,则为ExceptionUtils.getStackTrace(e) (2认同)

小智 7

使用以下格式,您可以获得堆栈跟踪:

java.util.logging.SimpleFormatter.format=%1$tF %1$tT [%4$-7s][%2$s] %5$s %6$s%n
Run Code Online (Sandbox Code Playgroud)

此模式中的要点是 %6$s。它将打印堆栈跟踪。


Mak*_*oto 6

你无法转换voidString; 没有这样的转换. void不会返回任何内容,因此您无需检索任何值.

您可能想要做的是通过获取异常的消息ex.getMessage().


小智 6

有一个重载的printStackTrace 方法接收PrintWriter。

你可以做这样的事情

Writer buffer = new StringWriter();
PrintWriter pw = new PrintWriter(buffer);
ex.printStackTrace(pw);
Logger.log(loglevel, buffer.toString());
Run Code Online (Sandbox Code Playgroud)


Cht*_*ect 5

您可以使用getStackTrace()方法获取 StackTraceElements 数组,并从那里生成一个字符串。否则,如果仅最终错误消息就足够了,请使用getMessage()Makoto 建议的方法。

String要从对象数组中获取堆栈跟踪StackTraceElement,您需要迭代该数组(取自 JDK7 源代码):

StringBuilder builder = new StringBuilder();
StackTraceElement[] trace = getOurStackTrace();
    for (StackTraceElement traceElement : trace)
        builder.append("\tat " + traceElement + "\n");
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用printStackTrace(PrintStream s),您可以在其中指定要打印堆栈跟踪的位置:

ByteArrayOutputStream out1 = new ByteArrayOutputStream();
PrintStream out2 = new PrintStream(out1);
ex.printStackTrace(out2);
String message = out1.toString("UTF8");
Run Code Online (Sandbox Code Playgroud)

  • 只需使用 apache commons ExceptionUtils 库即可;无需重新发明轮子 (2认同)