配置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
的等价物?
答案 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
。
答案 3 :(得分:0)
另一种选择是使用replace转化字。以下正则表达式删除了不需要的调用者和额外的新行:
%replace(%caller{1}){'Caller\+0\s*at\s*([^\n]*)\n', '$1'}