2016-04-14 23 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

相关问题