2016-04-14 11 views
5

Ich habe folgende Pattern:Wie nur Nachricht statt alle Zeile in log4j zu entkommen?

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

aber entkommt vollständige Protokollierung Reihe.

Ich möchte so etwas haben, aber nur für die Nachricht.

aber LoggingEvent Klasse hat nicht setMessage und setRenderedMessage Methoden.

Und ich sehe Kopie Konstruktor bei LoggingEvent nicht. Wenn LoggingEvent Kopierkonstruktor hatte, kann ich von LoggingEvent geerbt werden und Methoden überschreiben, die unten erwähnt werden.

Bitte beraten Sie mich, wie ich mein Problem lösen kann.

Antwort

0

Du hast recht, es gibt keinen LoggingEvent(LoggingEvent other) Konstruktor, aber Sie können die Veranstaltungs-Werte an die LoggingEvent constructor in Ihrem format Methode wie folgt übergeben:

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

Dies wird eine neue LoggingEvent von der alten erstellen mit Alle Werte eingestellt. Die StringEscapeUtils.escapeJava Methode kann nun modifizieren, um die die message, ohne die anderen Eigenschaften zu beeinträchtigen und Sie noch super.format

0

Ein alternativer Ansatz zu schaffen sein, um eine angepasste LogEventFactory verwenden können könnte. Ein LogEventFactory wird verwendet, um LogEvents zu generieren. Anwendungen können den Standard LogEventFactory ersetzen, indem Sie den Wert der Systemeigenschaft Log4jLogEventFactory auf den Namen der benutzerdefinierten LogEventFactory-Klasse festlegen.

Die Methode, die eine Instanz von LogEvent ist zu erstellen aufgerufen wird, wie folgt:

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) 

und DefaultLogEventFactory die grundlegende Implementierung für log4j ist. In Ihrem Fall könnten Sie die Basisimplementierung erweitern und die Nachricht, nach der Sie die Standardimplementierung aufrufen, umgehen. Es wäre so etwas wie dieses werden:

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

Ich sehe DefaultLogEventFactory nicht – gstackoverflow

+0

Es ist in 'org.apache.logging.log4j.core.impl' Version 2.x von log4j – uniknow

+0

Ich verwende 1.2.17 Version – gstackoverflow