我正在使用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;
}
ch.qos.logback.classic.PatternLayout
包:
defaultConverterMap.put("n", LineSeparatorConverter.class.getName());
因此,确保固定行尾的正确方法是使用属性line.separator
。
java.lang.System.lineSeparator()
的实现方式相同:
lineSeparator = props.getProperty("line.separator");