【问题标题】:Logback multiline pattern - text after line separatorLogback 多行模式 - 行分隔符后的文本
【发布时间】:2018-02-07 12:18:18
【问题描述】:

我正在为 Logback 配置日志。

XML 配置如下:

<configuration>
   <appender name="console" class="...">
     <encoder>
       <pattern>Message:%nText: %m</pattern>
     </encoder>
  </appender>
  ...
</configuration>

想法是日志记录应该是多行的:

Message:
Text: [Message text here]

但是当我运行应用程序时,我得到一个异常:

ch.qos.logback.core.pattern.parser.Compiler@8dbdac1 中的错误 - 没有为转换字 [nText] 注册转换类

所以,问题是 '%n' 和 'Text' 字符串合并为一个字符串。

作为一种解决方法,我可以用空格分开写它们:

Message:%n Text: %m

但在这种情况下,空格出现在日志中'Text'之前

Message:
 Text:

是否有一些解决方案(空字符串或类似的转义字符)?

谢谢。

【问题讨论】:

    标签: xml logging logback


    【解决方案1】:

    来自logback manual Ch. 6: Layouts:

    在大多数情况下,文字自然包含空格或其他定界字符,因此它们不会与转换词混淆。例如,模式“%level [%thread] - %message%n”包含字符串文字“[”和“] -”。但是,如果一个可以成为 java 标识符一部分的字符紧跟在转换词之后,logback 的模式解析器将被愚弄,认为文字是转换词的一部分。例如,模式 "%date%nHello" 将被解释为两个转换词 %date 和 %nHello,由于 %nHello 不是已知的转换词,logback 将为 %nHello 输出 %PARSER_ERROR[nHello]。如果您希望字符串文字“Hello”立即分隔 %n 和 Hello,请将空参数列表传递给 %n。例如,“%date%n{}Hello”将被解释为 %date 后跟 %n 后跟文字“Hello”。

    所以,试试Message:%n{}Text: %m

    【讨论】:

    • 谢谢!我在文档的特殊符号表中搜索了这个,但它在单独的段落中。
    【解决方案2】:

    Logback 的 PatternLayout 包含 defaultConverterMap,它将转换词(%n%ex 等)映射到 ch.qos.logback.core.pattern.Converter 的实现。

    正如您正确发现的那样,%nText 不是转换词,没有办法“逃避”%nT 是连续的这一事实。

    但是,您可以提供自己的 ch.qos.logback.core.pattern.Converter 实现并将其与自定义转换词相关联,如下所示...

    1. 将此添加到logback.xml

      <conversionRule conversionWord="nt" converterClass="some.package.CustomLineSeparatorConverter" />
      
    2. 如下实现some.package.CustomLineSeparatorConverter

      import ch.qos.logback.classic.pattern.ClassicConverter;
      import ch.qos.logback.classic.spi.ILoggingEvent;
      import ch.qos.logback.core.CoreConstants;
      
      public class CustomLineSeparatorConverter extends ClassicConverter {
      
          public String convert(ILoggingEvent event) {
              return CoreConstants.LINE_SEPARATOR + "Text:";
          }
      }
      
    3. 更新您的编码器模式以使用转换字nt

      <encoder>
          <pattern>Message:%nt %m</pattern>
      </encoder>
      

    通过这些更改,您的自定义转换器将启用,输出将是:

    Message:
    Text: some log output
    

    【讨论】:

    • 感谢您的提示!似乎我的情况的解决方案应该更容易,但是对于特殊情况使用 CustomLineSeparatorConverter 是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2016-02-07
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2020-03-28
    相关资源
    最近更新 更多