[英]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.