如何只迁移消息而不是log4j中的所有行?

gst*_*low 5 java logging log4j escaping pattern-layout

我有以下PatternLayout:

public class EscapedEnhancedPatternLayout extends EnhancedPatternLayout {
    @Override
    public String format(LoggingEvent event) {
        return StringEscapeUtils.escapeJava(super.format(event));
    }
}
Run Code Online (Sandbox Code Playgroud)

但这会逃脱完整的日志行.

我希望有这样的东西,但仅限于消息.

但是LoggingEvent班级没有setMessagesetRenderedMessage方法.

而且我没有看到复制构造函数LoggingEvent.如果LoggingEvent有复制构造函数我可以继承LoggingEvent并覆盖下面提到的方法.

请告诉我如何解决我的问题.

小智 0

你是对的,没有LoggingEvent(LoggingEvent other)构造函数,但您可以将事件的值传递给方法中的LoggingEvent 构造函数,format如下所示:

@Override
public String format(LoggingEvent event) {
    Object msgObj = event.getMessage();

    LoggingEvent newEvent = new LoggingEvent(
        event.getFQNOfLoggerClass(),
        event.getLogger(), event.getTimeStamp(),
        event.getLevel(),
        StringEscapeUtils.escapeJava(msgObj != null ? msgObj.toString() : null),
        event.getThreadName(),
        event.getThrowableInformation(),
        event.getNDC(),
        event.getLocationInformation(),
        event.getProperties());

    return super.format(newEvent);
}
Run Code Online (Sandbox Code Playgroud)

LoggingEvent这将从旧值创建一个新值并设置所有值。该StringEscapeUtils.escapeJava方法现在可以修改message而不影响其他属性,您仍然可以使用super.format