簡體   English   中英

Logback 模式等效於 log4j %l

[英]Logback pattern equivalent of log4j %l

配置 log4j 我可以使用log4j 1.2 模式%l來給我調用者的位置,它輸出:

... com.example.FooBar.doSomething(FooBar.java:123) ...

我正在嘗試切換到 Logger,因為它“打算作為log4j的后繼者” ,並且對 log4j 1.2 進行了各種改進

但是 Logback 沒有%l模式。 我能找到的最接近的Logback 模式%caller{1} ,但這給了我一些丑陋的東西:

... Caller+0     at com.example.FooBar.doSomething(FooBar.java:123)
...

請注意,為了丑陋而侮辱,它在我的日志行中間添加了一個換行符。 (當時我沒有在模式中指定換行符。)

如何在我的 Logback 模式中獲得相當於 log4j %l的值?

正如durron597指出的那樣,似乎無法完全替代log4j %l的單個轉換變量。 但是通過組合多個轉換變量,可以達到相同的效果。

用以下用於Logback的實例專門替換log4j配置中的%l每個實例: %class.%method\\(%file:%line\\)

(如果您以編程方式執行此操作,請確保根據Java字符串的要求將反斜杠加倍。)

這些變量中有幾個表示降低了應用程序的性能。 不過,我已經看過源代碼,並且至少緩存了相關信息,因此在模式中使用多個慢轉換變量不會比僅使用一個慢。

您可以擴展CallerDataConverter並覆蓋convert為行分隔符的條。 PatternLayout公開轉換器的靜態映射。 您可以使用轉換器作為引導程序的一部分來更新此映射,最好在某些類初始化靜態塊中進行。 不漂亮,但應該可以。

您是正確的, %l在登錄中不再存在。 這可能是因為,通過您自己的文檔鏈接:

位置信息可能非常有用。 但是,它的生成速度非常慢 ,除非執行速度不是問題,否則應避免使用它。

不幸的是,即使您正確地認為它是%l的最佳替代品,您也無法對%caller做得更好。 如您在此處的源代碼中所見,該換行符已完全嵌入到錯誤消息生成步驟中。

希望我對您有更好的消息,但我認為如果沒有自定義Layout您將無法做得更好。 您可以對此稍作安慰,因為之前已經有人問過這個問題


剛剛在這里提交了新的功能請求。

另一種選擇是使用替換轉換詞。 以下正則表達式刪除了不需要的Caller和多余的新行:

%replace(%caller{1}){'Caller\+0\s*at\s*([^\n]*)\n', '$1'}

剛剛修改了上面經過驗證的答案中的一些內容,

%logger{50}.%M\\\\(%file:%line\\\\)

(根據文檔)對於 xml 配置,即使我嘗試在括號前添加一個反斜杠\\也不起作用,請嘗試添加雙反斜杠,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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