我有以下PatternLayout:

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

但这会转出完整的日志记录行。

我想要这样的东西,但仅用于消息传递。

但是LoggingEvent类没有setMessagesetRenderedMessage方法。

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

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

最佳答案

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

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

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

10-01 11:59