2016-04-14 44 views
5

我有以下的PatternLayout:如何只轉義消息而不是log4j中的所有行?

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

但這逃脫完整日誌行。

我想擁有這樣的東西,但僅限於消息。

但是LoggingEvent類別還沒有setMessagesetRenderedMessage方法。

而我沒有看到複製構造函數在LoggingEvent。如果LoggingEvent有複製構造函數,我可以從LoggingEvent繼承並覆蓋下面提到的方法。

請告訴我如何解決我的問題。

回答

0

你是對的,沒有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

0

另一種方法是創建自定義LogEventFactory。 A LogEventFactory用於生成LogEvents。應用程序可以通過將系統屬性Log4jLogEventFactory的值設置爲自定義LogEventFactory類的名稱來替換標準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); 
    } 
} 
+0

我沒有看到DefaultLogEventFactory – gstackoverflow

+0

這是在'log4j的 – uniknow

+0

的org.apache.logging.log4j.core.impl' 2.x版本我用1.2.17版本 – gstackoverflow

相關問題