5

私は次のPatternLayoutを持っています:

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

しかし、これは完全なログ行をエスケープします。

このようなものが欲しいのですが、メッセージのみです。

しかし、LoggingEventクラスにはメソッドがsetMessageありません。setRenderedMessage

そして、コピー コンストラクターが に表示されませんLoggingEventLoggingEventコピー コンストラクターがあればLoggingEvent、以下のメソッドを継承してオーバーライドできます。

私の問題を解決する方法を教えてください。

4

2 に答える 2

0

その通りです。コンストラクターはありませんが、次のように、イベントの値をメソッド内のLoggingEvent コンストラクターLoggingEvent(LoggingEvent other)に渡すことができます。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 に答える