Logback multiline pattern - 行分隔符后的文本

时间:2018-02-07 12:18:18

标签: xml logging logback

我正在为Logback配置日志。

XML配置如下:

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

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

Message:
Text: [Message text here]

但是当我运行app时,我得到一个例外:

  

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

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

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

Message:%n Text: %m

但在这种情况下,空格会出现在“文字”

之前的日志中
Message:
 Text:

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

谢谢。

2 个答案:

答案 0 :(得分:2)

来自logback manual Ch. 6: Layouts:

  

在大多数情况下,文字自然包含空格或其他分隔字符,因此它们不会与转换字混淆。例如,模式&#34;%级别[%thread] - %message%n&#34;包含字符串文字&#34; [&#34;和&#34;] - &#34;。但是,如果一个可以作为java标识符一部分的字符紧跟在转换字之后,则logback的模式解析器将被误认为该文字是转换字的一部分。例如,模式&#34;%date%nHello&#34;将被解释为两个转换字%date和%nHello,并且由于%nHello不是已知的转换字,因此logback将为%nHello输出%PARSER_ERROR [nHello]。如果你希望字符串文字&#34;你好&#34;要立即分隔%n和Hello,将空参数列表传递给%n。例如,&#34;%date%n {} Hello&#34;将被解释为%date,后跟%n,后跟文字&#34; Hello&#34;。

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

答案 1 :(得分:0)

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>
    
  4. 进行这些更改后,您的自定义转换器将被启用,输出将为:

    Message:
    Text: some log output