9

我正在使用 Logback,并且在记录用户参数时需要避免使用 CRLF(回车和换行)。
我试图在静态地图 PatternLayout.defaultConverterMap 上添加我的类,它扩展了 ClassicConverter,但它没有用。

谢谢,

4

3 回答 3

3

您应该按照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>
于 2016-12-23T13:12:38.743 回答
0

为了快速解决,我们%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。)

于 2022-02-02T01:16:21.950 回答
0

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");
于 2021-03-23T15:33:43.207 回答