slf4j如何打印java异常堆栈信息throwable对象

SLF4J 1.6.0 以前的版本,如果打印异常堆栈信息,必须用

log.info等对应方法.

如果msg含有变量,一般用String.format方法格式化msg.

如果用

error(Stringformat,Object…arguments)

等其它方法,,异常堆栈信息会丢失.

幸好,SLF4J 1.6.0以后的版本对这个不友好的异常信息log 改进了.

最后一个参数.如果不遵守这个规定,异常堆栈信息不会log出来.

官方FAQ:

Can I log an exception without an accompanying message?

In short, no.

Ifeis anException, and you would like to log an exception at the ERROR level, you must add an accompanying message. For example,

You might legitimately argue that not all exceptions have a meaningful message to accompany them. Moreover, a good exception should already contain a self explanatory description. The accompanying message may therefore be considered redundant.

While these are valid arguments, there are three opposing arguments also worth considering. First, on many, albeit not all occasions, the accompanying message can convey useful information nicely complementing the description contained in the exception. Frequently, at the point where the exception is logged, the developer has access to more contextual information than at the point where the exception is thrown. Second, it is not difficult to imagine more or less generic messages, e.g. "Exception caught", "Exception follows", that can be used as the first argument forerror(String msg, Throwable t)invocations. Third, most log output formats display the message on a line, followed by the exception on a separate line. Thus, the message line would look inconsistent without a message.

In short, if the user were allowed to log an exception without an accompanying message, it would be the job of the logging system to invent a message. This is actually what thethrowing(String sourceClass, String sourceMethod, Throwable thrown)method in java.util.logging package does. (It decides on its own that accompanying message is the string "THROW".)

It may initially appear strange to require an accompanying message to log an exception. Nevertheless, this is common practice inalllog4j derived systems such as java.util.logging, logkit, etc. and of course log4j itself. It seems that the current consensus considers requiring an accompanying message as a good a thing (TM).

In the presence of an exception/throwable, is it possible to parameterize a logging statement?

Yes, as of SLF4J 1.6.0, but not in previous versions. The SLF4J API supports parametrization in the presence of an exception, assuming the exception is the last parameter. Thus,

logger}

will print theNumberFormatExceptionwith its stack trace as expected. The java compiler will invoke theerror method taking a String and two Object arguments. SLF4J, in accordance with the programmer’s most probable intention, will interpretNumberFormatExceptioninstance as a throwable instead of an unusedObjectparameter. In SLF4J versions prior to 1.6.0, theNumberFormatExceptioninstance was simply ignored.

If the exception is not the last argument, it will be treated as a plain object and its stack trace will NOT be printed. However, such situations should not occur in practice.

如果困难是地上的荆棘,我们脱掉鞋子,光着脚笑笑,

slf4j如何打印java异常堆栈信息throwable对象

相关文章:

你感兴趣的文章:

标签云: