logback模式相当于log4j%l

时间:2015-08-22 16:36:04

标签: java logging log4j logback

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

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

我试图切换到Logger,因为log {4} "intended as a successor"并且log4j上的all sorts of improvements为1.2

但Logback没有%l模式。我能找到的最近的Logback pattern%caller{1},但这给了我一些丑陋的东西:

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

请注意,添加侮辱丑陋,它会在我的日志行中间添加一个换行符。 (此时我没有在模式中指定换行符。)

如何在Logback模式中获得log4j %l的等价物?

4 个答案:

答案 0 :(得分:1)

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

使用以下内容替换log4j配置中的%l的每个实例:%class.%method\(%file:%line\)

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

其中一些变量表示会降低应用程序的性能。不过,我已经查看了源代码,并且至少缓存了相关信息,这样在模式中使用多个慢转换变量的性能不会比仅使用一个差。

答案 1 :(得分:1)

您可以扩展 this.setState(({ routes }) => ({ routes: routes.map((route, index) => ({ ...route, selected: index === toSelect })), })); 并覆盖CallerDataConverter以去除行分隔符。 convert公开了转换器的静态映射。您可以使用转换器作为引导程序的一部分来更新此映射,最好在某些类初始化静态块中进行。不漂亮,但应该可以。

答案 2 :(得分:0)

你是正确的,%l在logback中不再存在。这可能是因为,从您自己的文档链接:

  

位置信息非常有用。但是,它的生成非常慢,应该避免,除非执行速度不是问题。

不幸的是,%caller无法做得更好,即使你是正确的,它是%l的最佳替代品。正如您所看到的jQuery File Tree,该新行已完全嵌入到错误消息生成步骤中。

我希望我有更好的消息,但如果没有in the source here,我认为你不会做得更好。你可以在custom Layout

这一事实中获得一些小小的安慰

我有this has been asked before

答案 3 :(得分:0)

另一种选择是使用replace转化字。以下正则表达式删除了不需要的调用者和额外的新行:

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