我正在为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:
是否有一些解决方案(空字符串或类似字符的转义字符)?
谢谢。
答案 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
不是转化词,而且无法“逃避”%n
和T
是连续的事实。
但是,您可以提供自己的ch.qos.logback.core.pattern.Converter
实施,并将其与自定义转化字相关联,如下所示......
将其添加到logback.xml
<conversionRule conversionWord="nt" converterClass="some.package.CustomLineSeparatorConverter" />
按如下方式实施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:";
}
}
更新编码器模式以使用转换字nt
:
<encoder>
<pattern>Message:%nt %m</pattern>
</encoder>
进行这些更改后,您的自定义转换器将被启用,输出将为:
Message:
Text: some log output