【问题标题】:Logback pattern equivalent of log4j %l等效于 log4j %l 的 logback 模式
【发布时间】:2015-08-22 16:36:03
【问题描述】:

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

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

我正在尝试切换到 Logger,因为它是 "intended as a successor" 到 log4j 并且在 log4j 1.2 上具有 all sorts of improvements

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

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

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

如何在我的 Logback 模式中获得相当于 log4j %l 的内容?

【问题讨论】:

    标签: java logging log4j logback


    【解决方案1】:

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

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

    不幸的是,%caller 的效果再​​好不过了,尽管您认为它是%l 的最佳替代品是正确的。如您所见in the source here,该换行符非常彻底地嵌入到错误消息生成步骤中。

    我希望我有更好的消息告诉你,但我认为如果没有custom Layout,你将无法做得更好。 this has been asked before.


    我有just submitted a new Feature Request here.

    【讨论】:

    • 我想这是正确的答案,尽管我不喜欢它。但是你的 JIRA 票不应该是“次要的”——这可能会阻止我的客户使用 Logback,即使它据说比 log4j 更好。还有一个提示:在 JIRA 中,添加 \ 以转义大括号,这样它们就不会在描述中被错误地解释。最后,感谢您抽出宝贵时间对此进行调查并向 Logback 提交问题。
    • 顺便说一句,您应该在报价单中指出您所指的文档。您从 %llog4j 文档中复制。但是 Logback 对%caller 没有类似的措辞,我想要的只是格式更好的%caller 信息。 (也许它确实会影响性能;但我们从 Logback 文档中不知道这一点。)我会说这是一个错误,而不是功能请求 --- 无论性能或 JVM 差异如何,我都没有要求换行而且我不希望在模式中记录单个字符串时得到一个。
    • 再次感谢您的帮助。但我只是重新阅读了我的问题,并意识到这是如何在 Logback 上获得相当于 log4j %l 的内容。所以我会用这些信息单独回答我自己的问题。
    • @GarretWilson 我查看了 log4j 和 logback 的源代码;这对于 logback 来说是一个不小的机会,如果这很容易,我会提出一个 pull request 而不是 JIRA 案例。
    • 另外,主要的错误是针对崩溃之类的,尽管你想要这个功能,但它不符合 Logback 团队对“主要”的内部定义。 “功能请求”与错误问题也是如此。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          只是在上面验证的答案中修改了一些东西,

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-08-30
            • 2018-06-09
            • 1970-01-01
            • 1970-01-01
            • 2013-11-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多