[英]slf4j: how to log formatted message, object array, exception
記錄填充消息和異常堆棧跟蹤的正確方法是什么?
logger.error(
"\ncontext info one two three: {} {} {}\n",
new Object[] {"1", "2", "3"},
new Exception("something went wrong"));
我想產生與此類似的輸出:
context info one two three: 1 2 3
java.lang.Exception: something went wrong
stacktrace 0
stacktrace 1
stacktrace ...
slf4j 版本 1.6.1
從 SLF4J 1.6.0 開始,在存在多個參數的情況下,如果日志語句中的最后一個參數是異常,那么 SLF4J 將假定用戶希望將最后一個參數視為異常而不是簡單參數。 另請參閱相關的常見問題解答條目。
所以,寫作(在 SLF4J 1.7.x 及更高版本中)
logger.error("one two three: {} {} {}", "a", "b",
"c", new Exception("something went wrong"));
或寫作(在 SLF4J 版本 1.6.x 中)
logger.error("one two three: {} {} {}", new Object[] {"a", "b",
"c", new Exception("something went wrong")});
會屈服
one two three: a b c
java.lang.Exception: something went wrong
at Example.main(Example.java:13)
at java.lang.reflect.Method.invoke(Method.java:597)
at ...
確切的輸出將取決於底層框架(例如 logback、log4j 等)以及底層框架的配置方式。 但是,如果最后一個參數是異常,則無論底層框架如何,它都會被解釋為異常。
除了@Ceki 的回答,如果您在項目中使用 logback 並設置配置文件(通常是 logback.xml),您還可以定義日志以繪制堆棧跟蹤
<encoder>
<pattern>%date |%-5level| [%thread] [%file:%line] - %msg%n%ex{full}</pattern>
</encoder>
模式中的 %ex 是與眾不同的
接受的答案很棒。 我只是在這里添加我現在正在工作的案例,感謝您的回答。 這可能會幫助其他人。
我正在使用SLF4J
和帶有 JSON 編碼器的logback
。 此外,我使用marker
和arguments
來豐富我的輸出。
logger.error(getMarker("errorEvent"),
"An error occurred",
entries(mapOf("someKey" to "someValue")),
new Exception())
輸出:
{ "level": "ERROR", "event": "errorEvent", "eventData": { "someKey": "someValue" }, "stacktrace": "...omitted...", "message": "An error occurred" }
當然在幕后有很多logstash
的配置,但我只是想表明作為entries
傳遞的arguments
顯示在配置的eventData
標簽中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.