相当于 log4j %l 的 Logback 模式

Logback pattern equivalent of log4j %l

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

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

我正在尝试切换到 Logger,因为它 "intended as a successor" to log4j and has 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 的等价物?

你说得对,%l 不再存在于 logback 中。这可能是因为,根据您自己的文档 link:

The location information can be very useful. However, its generation is extremely slow and should be avoided unless execution speed is not an issue.

不幸的是,您无法使用 %caller 做得更好,尽管您认为它是 %l 的最佳替代品是正确的。如您所见in the source here,换行符完全嵌入到错误消息生成步骤中。

我希望我有更好的消息告诉你,但我认为如果没有 custom Layout. You can take some small comfort in the fact that this has been asked before,你将无法做得更好。


我有just submitted a new Feature Request here.

正如 durron597 所指出的,可以完全替代 log4j %l 的单个转换变量似乎不可用。但是通过组合几个转换变量可以达到同样的效果。

将 log4j 配置中 %l 的每个实例具体替换为 Logback 的以下内容:%class.%method\(%file:%line\)

(如果您以编程方式执行此操作,请确保根据 Java 字符串的要求将反斜杠加倍。)

这些变量中有几个表明会降低应用程序的性能。不过,我查看了源代码,至少缓存了相关信息,因此在模式中使用多个慢速转换变量的性能不会比只使用一个更差。

另一种选择是使用 replace 转换词。以下正则表达式删除不需要的来电者和额外的换行符:

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

您可以扩展 CallerDataConverter 并覆盖 convert 以去除行分隔符。 PatternLayout 公开转换器的静态映射。作为 bootstrap 的一部分,您可以使用您的转换器更新此映射,最好在某些 class 初始化静态块中进行。不漂亮,但应该工作。

刚刚修改了上面经过验证的答案中的一些内容,

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

(根据文档)对于 xml 配置,即使我尝试在括号前面添加一个反斜杠 \,但不起作用,请尝试添加双反斜杠,