如何避免Logback中的CRLF(回车和换行)- CWE 117

9
我正在使用Logback,需要在记录用户参数时避免CRLF(回车和换行)的出现。 我尝试将我的类添加到静态映射PatternLayout.defaultConverterMap中,该类继承ClassicConverter,但它没有起作用。
谢谢。

CRLF是从哪里来的?你是如何记录这个的?你的模式是什么样子的? - Darius X.
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)", "");
    }

}

Logback配置:
<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>

2

为了快速解决问题,我们在模式中使用了%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


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;
}

ch.qos.logback.classic.PatternLayout包:

    defaultConverterMap.put("n", LineSeparatorConverter.class.getName());

因此,确保固定行尾的正确方法是使用属性line.separator

java.lang.System.lineSeparator()的实现方式相同:

lineSeparator = props.getProperty("line.separator");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接