相当于log4j %l的Logback模式

gwo2fgha  于 2022-11-06  发布在  其他
关注(0)|答案(5)|浏览(183)

配置log4j我可以使用log4j 1.2 pattern%l来给予调用者的位置,它输出:

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

我正在尝试切换到Logger,因为它是"intended as a successor"到log4j,并且all sorts of improvements在log4j 1.2之上
但是Logback没有%l模式,我能找到的最接近的Logback pattern%caller{1},但这给了我一些不好的东西:

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

请注意,它在日志行的中间添加了一个换行符(我当时没有在模式中指定换行符),这是对丑陋的侮辱。
如何在我的Logback模式中获得log4j %l的等效项?

qgelzfjb

qgelzfjb1#

%l不再存在于回退中,这是正确的。这可能是因为,从您自己的文档链接中可以看到:
位置信息可能非常有用。但是,它的生成极其缓慢,除非执行速度不是问题,否则应避免使用。
不幸的是,即使您认为%caller%l的最佳替代品,但您也不能用它做得更好。正如您在此处的源代码中所看到的,换行符完全嵌入在错误消息生成步骤中。
我希望我有更好的消息给你,但我不认为你将能够做得更好,没有一个自定义的Layout
我有just submitted a new Feature Request here.

bhmjp9jg

bhmjp9jg2#

正如durron597所指出的那样,一个单独的转换变量可以完全替代log4j %l似乎是不可能的,但是通过组合几个转换变量可以达到同样的效果。
请特别将log4j配置中的每个%l示例替换为以下内容以进行Logback:%class.%method\(%file:%line\)
(If如果您是通过编程方式执行此操作,请确保按照Java字符串的要求使用双反斜杠。)
这些变量中有几个会降低应用程序的性能。不过,我已经查看了源代码,至少相关信息被缓存了,因此在模式中使用多个缓慢的转换变量不会比只使用一个更差。

lb3vh1jj

lb3vh1jj3#

另一个选择是使用replace转换词。下面的正则表达式删除不需要的Caller和额外的新行:

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

csbfibhn4#

您可以扩展CallerDataConverter并覆盖convert以去除行分隔符。PatternLayout公开了转换器的静态Map。您可以在引导过程中使用转换器更新此Map,最好在某些类初始化静态块中进行。虽然不美观,但应该可以工作。

pzfprimi

pzfprimi5#

只是修改了上面已验证答案中一些内容,
\
(As对于xml配置,即使我尝试在括号前添加一个反斜杠\,也不起作用,请尝试添加两个反斜杠,

相关问题