我正在使用 Logback,并且在记录用户参数时需要避免使用 CRLF(回车和换行)。
我试图在静态地图 PatternLayout.defaultConverterMap 上添加我的类,它扩展了 ClassicConverter,但它没有用。
谢谢,
我正在使用 Logback,并且在记录用户参数时需要避免使用 CRLF(回车和换行)。
我试图在静态地图 PatternLayout.defaultConverterMap 上添加我的类,它扩展了 ClassicConverter,但它没有用。
谢谢,
您应该按照logback 文档中的说明创建自定义布局
自定义布局:
package com.foo.bar;
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.ILoggingEvent;
public class RemoveCRLFLayout extends PatternLayout {
@Override
public String doLayout(ILoggingEvent event) {
return super.doLayout(event).replaceAll("(\\r|\\n)", "");
}
}
回退配置:
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="com.foo.bar.RemoveCRLFLayout">
<pattern>%d %t %-5p %logger{16} - %m%n</pattern>
</layout>
</encoder>
为了快速解决,我们%replace
在模式中使用了一个表达式来替换消息中的换行和回车。
请注意,此示例使用 Spring Boot 属性来设置模式,但您可以以相同的方式在 Logback 配置文件中使用 %replace。
logging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %replace(%msg){'\n|\r', '_'}%n"
(自定义转换器本来是我的首选,但我无法让它与 Spring Boot 和 Spring Cloud Config 一起使用。如果您想了解有关该方法的更多信息,请在 logback 文档中搜索conversionRule
。)
ch.qos.logback.core.CoreConstants
;
public static final String LINE_SEPARATOR = System.getProperty("line.separator");
ch.qos.logback.classic.pattern.LineSeparatorConverter
:
public String convert(ILoggingEvent event) {
return CoreConstants.LINE_SEPARATOR;
}
package ch.qos.logback.classic.PatternLayout
:
defaultConverterMap.put("n", LineSeparatorConverter.class.getName());
因此,确保固定行结束的正确方法是属性line.separator
。
相同的实现适用于java.lang.System.lineSeparator()
:
lineSeparator = props.getProperty("line.separator");