簡體   English   中英

slf4j:如何記錄格式化消息、對象數組、異常

[英]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 開始,在存在多個參數的情況下,如果日志語句中的最后一個參數是異常,那么 SL​​F4J 將假定用戶希望將最后一個參數視為異常而不是簡單參數。 另請參閱相關的常見問題解答條目

所以,寫作(在 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 此外,我使用markerarguments來豐富我的輸出。

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM