配置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
的等效项?
5条答案
按热度按时间qgelzfjb1#
%l
不再存在于回退中,这是正确的。这可能是因为,从您自己的文档链接中可以看到:位置信息可能非常有用。但是,它的生成极其缓慢,除非执行速度不是问题,否则应避免使用。
不幸的是,即使您认为
%caller
是%l
的最佳替代品,但您也不能用它做得更好。正如您在此处的源代码中所看到的,换行符完全嵌入在错误消息生成步骤中。我希望我有更好的消息给你,但我不认为你将能够做得更好,没有一个自定义的
Layout
。我有just submitted a new Feature Request here.
bhmjp9jg2#
正如durron597所指出的那样,一个单独的转换变量可以完全替代log4j
%l
似乎是不可能的,但是通过组合几个转换变量可以达到同样的效果。请特别将log4j配置中的每个
%l
示例替换为以下内容以进行Logback:%class.%method\(%file:%line\)
(If如果您是通过编程方式执行此操作,请确保按照Java字符串的要求使用双反斜杠。)
这些变量中有几个会降低应用程序的性能。不过,我已经查看了源代码,至少相关信息被缓存了,因此在模式中使用多个缓慢的转换变量不会比只使用一个更差。
lb3vh1jj3#
另一个选择是使用replace转换词。下面的正则表达式删除不需要的Caller和额外的新行:
csbfibhn4#
您可以扩展
CallerDataConverter
并覆盖convert
以去除行分隔符。PatternLayout
公开了转换器的静态Map。您可以在引导过程中使用转换器更新此Map,最好在某些类初始化静态块中进行。虽然不美观,但应该可以工作。pzfprimi5#
只是修改了上面已验证答案中一些内容,
\
(As对于xml配置,即使我尝试在括号前添加一个反斜杠
\
,也不起作用,请尝试添加两个反斜杠,