相当于 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,你将无法做得更好。
正如 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 配置,即使我尝试在括号前面添加一个反斜杠 \
,但不起作用,请尝试添加双反斜杠,
配置 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,你将无法做得更好。
正如 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 配置,即使我尝试在括号前面添加一个反斜杠 \
,但不起作用,请尝试添加双反斜杠,