如何使用java';s记录器类
我正在使用Java的如何使用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
记录器
类。我想将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);