5

我有以下 PatternLayout:

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

但这会逃脱完整的日志记录行。

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

但是LoggingEvent类没有setMessagesetRenderedMessage方法。

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

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

4

2 回答 2

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

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

于 2016-04-18T15:18:43.007 回答
0

另一种方法是创建一个定制的LogEventFactory. ALogEventFactory用于生成 LogEvents。LogEventFactory应用程序可以通过将系统属性的值设置为Log4jLogEventFactory自定义 LogEventFactory 类的名称来替换标准。

将被调用以创建实例的LogEvent方法如下:

LogEvent createEvent(String loggerName,
               org.apache.logging.log4j.Marker marker,
               String fqcn,
               org.apache.logging.log4j.Level level,
               org.apache.logging.log4j.message.Message data,
               List<Property> properties,
               Throwable t)

并且DefaultLogEventFactory是 log4j 的基本实现。在您的情况下,您可以扩展基本实现并转义消息,然后调用默认实现。它会变成这样:

public class MyCustomLogEventFactory extends DefaultLogEventFactory {

    /**
     * Creates a log event.
     *
     * @param loggerName The name of the Logger.
     * @param marker An optional Marker.
     * @param fqcn The fully qualified class name of the caller.
     * @param level The event Level.
     * @param data The Message.
     * @param properties Properties to be added to the log event.
     * @param t An optional Throwable.
     * @return The LogEvent.
     */
     @Override
    public LogEvent createEvent(final String loggerName, final Marker marker,
                             final String fqcn, final Level level, final Message data,
                             final List<Property> properties, final Throwable t) {
        super.createEvent(loggerName, marker, fqcn, level, StringEscapeUtils.escapeJava(data != null ? data.toString() : null), properties, t);
    }
}
于 2016-04-21T10:11:18.703 回答