如何使用java';s记录器类

如何使用java';s记录器类,java,logging,stack-trace,java.util.logging,Java,Logging,Stack Trace,Java.util.logging,我正在使用Java的记录器类。我想将ex.printStackTrace()传递到Logger.log(loglevel,String),但是printStackTrace()返回void。因此,我无法传递和打印异常的堆栈跟踪 是否有任何方法可以将void转换为String,或者是否有任何其他方法可以打印异常的整个堆栈跟踪?您不能将void转换为String;不存在这种转换void不会返回任何内容,因此您没有可检索的值 您可能需要做的是通过获取异常消息。正如Makoto所说,您可能需要执行一个e

我正在使用Java的
记录器
类。我想将
ex.printStackTrace()
传递到
Logger.log(loglevel,String)
,但是
printStackTrace()
返回
void
。因此,我无法传递和打印异常的堆栈跟踪


是否有任何方法可以将
void
转换为
String
,或者是否有任何其他方法可以打印异常的整个堆栈跟踪?

您不能将
void
转换为
String
;不存在这种转换
void
不会返回任何内容,因此您没有可检索的值


您可能需要做的是通过获取异常消息。

正如Makoto所说,您可能需要执行一个ex.getMessage()


为了进一步澄清,
void
表示没有返回任何内容。你不能把任何东西都扔进某物中:)

你需要明白
void
实际上就是
nothiness
。你不能转换什么都不是的东西。您可能会以字符串形式打印
void
,但是(相信我),您不希望这样

我想你要找的是

// assuming ex is your Exception object
logger.error(ex.getMessage(), ex);
// OR
Logger.log(errorLogLevel, ex.getMessage(), ex)
这将使用您配置的记录器打印错误消息。有关更多详细信息,您可以查看java文档中的您可以使用该方法获取StackTraceElements数组,并从中生成字符串。否则,如果只有最后的错误消息就足够了,请使用Makoto建议的
getMessage()
方法

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

另一个选项是使用
printStackTrace(PrintStream s)
,您可以在其中指定要打印stacktrace的位置:

ByteArrayOutputStream out1 = new ByteArrayOutputStream();
PrintStream out2 = new PrintStream(out1);
ex.printStackTrace(out2);
String message = out1.toString("UTF8");
使用并传入
ex
作为第三个参数,如下所示:

LOGGER.log(Level.INFO, ex.getMessage(), ex);

您可以使用以下命令将stacktrace转换为字符串。如果
e
是异常对象

StringWriter stringWriter= new StringWriter();
PrintWriter printWriter= new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
String stackTraceAsString= stringWriter.toString(); 

有一个重载的printStackTrace方法,它接受PrintWriter

你可以这样做

Writer buffer = new StringWriter();
PrintWriter pw = new PrintWriter(buffer);
ex.printStackTrace(pw);
Logger.log(loglevel, buffer.toString());

谢谢大家。我可以使用

LOGGER.log(Level.INFO, ex.getMessage(),ex);
//ex is my exception object

另一种选择是:

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

log.error("Exception : " + ExceptionUtils.getStackTrace(exception));

使用以下格式,您可以拥有堆栈跟踪:

java.util.logging.SimpleFormatter.format=%1$tF %1$tT [%4$-7s][%2$s] %5$s %6$s%n

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

您还可以使用apache库中的ExceptionUtils或下面的log语句

    try{
      doSomething();
    }
    catch(Exception e){
    log.error("Exception in method doSomething ",e);
    }

如果需要在不引发异常的情况下查看stacktrace,可以使用ExceptionUtils

String stackTrace = ExceptionUtils.getStackTrace(new Exception("YourMessage"));
log.error(stackTrace);

简而言之:不,你不能。当然,使用这个:从commons-lang3 3.4“nothing”将转换成什么样的字符串值?只需使用apache commons ExceptionUtils库;无需重新发明车轮1<代码>字符串消息=out1.toString(“UTF8”)-编译错误,应为0个参数,但得到1 2。它正常工作
out2.out.toString
。如果
out2.toString
->'PrintStream@hash“谢谢你,”阿西夫说。我现在可以记录整个堆栈跟踪。
logger.error()
不是
java.util.logging
,但我不会投你的反对票,因为我很高兴发现
logger.log(级别、异常、供应商)
。看来Oracle已经把
java.util.logging.Logger
弄得很难看了!由于他们正在这样做,奇怪的是他们没有进一步创建
logger.severe(String,Exception)
etc这个问题要求使用Java的logger类来解决。java.util.logging.Logger没有名为“error”的方法。正因为如此,我对这个答案投了反对票。这根本没有回答将堆栈跟踪打印到记录器的最初意图。getMessage()不是为此而设计的。因此,答案是:logger.log(Level.SEVERE,例如getMessage(),ex);我不会用这个参数记录堆栈跟踪,只有第二个参数。可以通过更改日志格式来抑制堆栈跟踪。您使用的是哪种格式化程序?您的日志格式是什么样子?这是问题的真实答案。@PanuHaaramo这取决于您使用的格式化程序。格式化程序需要在
format
中调用
record.getThrown()
。看看
SimpleFormatter
。如果你指的是org.apache.commons.lang3.exception.ExceptionUtils,那就是ExceptionUtils.getStackTrace(e)他想要的是堆栈跟踪,而不仅仅是消息。这是IMHO最简单的方法,它可以真正打印堆栈跟踪,而不仅仅是消息。
String stackTrace = ExceptionUtils.getStackTrace(new Exception("YourMessage"));
log.error(stackTrace);