2016-08-18 2 views
1

Wir haben einen Webserver und mehrere Benutzer loggen sich ein. Wir setzen den Loglevel normalerweise auf ERROR oder INFO Level. Aber manchmal müssen wir zu Debugging-Zwecken Protokolle anzeigen. Es gibt one way, um es zur Laufzeit einzustellen, aber dieser Prozess ist nicht so gut im Falle von viel Verkehr. Wichtige Logs werden vermisst und wir wissen auch nicht wie viel Zeit wir dafür aufwenden müssen. Ich habe einen Wrapper in log4j v1.2 geschrieben, der einfach die Level-Prüfung ignoriert, wenn Benutzerid zu einer TestUsersList gehört. Also, es öffnet nur alle Protokolle für einen bestimmten Benutzer [ein Thread]. Ein Ausschnitt ist unten-Log4j2, Loglevel zur Laufzeit für Thread-spezifisch einstellen

public void trace(Object message) { 
    Object diagValue = MDC.get(LoggerConstants.IS_ANALYZER_NUMBER); 
    if (valueToMatch.equals(diagValue)) { // Some condition to check test number 
     forcedLog(FQCN, Level.TRACE, message, null); 
     return; 
    } 
    if (repository.isDisabled(Level.TRACE_INT)) 
     return; 
    if (Level.TRACE.isGreaterOrEqual(this.getEffectiveLevel())) 
     forcedLog(FQCN, Level.TRACE, message, null); 
} 

Aber jetzt habe ich ziehe nach log4j2, ich will nicht diesen Wrapper wieder schreiben. Gibt es eine eingebaute Funktionalität, die log4j2 dafür bereitstellt?

Antwort

1

Dies kann mit Filtern erfolgen. Fügen Sie der Konfiguration einen Protokollierer hinzu, der alle gewünschten Nachrichten protokolliert, und fügen Sie dann einen ThreadContextMapFilter hinzu, der einen KeyValuePair für jeden Benutzer enthält, den Sie protokollieren möchten.

Dann setzen Sie die Benutzer-IDs in Thread Context innerhalb des Codes.