2017-03-07 3 views
1

Kann Log4j2 so konfiguriert werden, dass die Filter oder einige andere Komponenten bestimmte Werte aus dem Protokoll herausfiltern können? (Sollte aber andere Felder in derselben Zeile durchlassen)In Log4j2, ist es möglich, bestimmte Schlüsselwertpaare aus dem Logger basierend auf dem Schlüssel herauszufiltern?

Sagen Sie die folgenden Zeilen im Protokoll erscheinen

[operation=DONE, userName=junitUser, tenant=Tenant [tenantID=default], needDetails=1, message=BaseMsg [version=1.0, sdk=AppSDK [version=1.3, protocols=[4aac81ca, 393ae7a0]], device=Device [id=12345, type=Pompom, info=Dot's Device]]], channel=null 
[operation=DONE, userName=junitUser224, tenant=Tenant [tenantID=default], needDetails=1, message=BaseMsg [version=1.0, sdk=AppSDK [version=1.3, protocols=[4aac81ca,393ae7a0]], device=Device [id=123456, type=Mamamia, info=tom's Device]]], channel=null 

Jetzt kann ich das „username“ Feld so herauszufiltern, dass das Protokoll Linien enthalten es jetzt nicht wie unten gezeigt?

[operation=DONE, tenant=Tenant [tenantID=default], needDetails=1, message=BaseMsg [version=1.0, sdk=AppSDK [version=1.3, protocols=[4aac81ca, 393ae7a0]], device=Device [id=12345, type=Pompom, info=Dot's Device]]], channel=null 
[operation=DONE, tenant=Tenant [tenantID=default], needDetails=1, message=BaseMsg [version=1.0, sdk=AppSDK [version=1.3, protocols=[4aac81ca,393ae7a0]], device=Device [id=123456, type=Mamamia, info=tom's Device]]], channel=null 

Hier ist meine log4j2.xml

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
    </Console> 
    <RollingFile name="RollingFile" fileName="/Users/dunston/logs/app.log" 
       filePattern="logs/app-%d{MM-dd-yyyy}.log.gz"> 
     <RegexFilter regex=".* zinger_log .*" onMatch="ACCEPT" onMismatch="DENY"/> 

     <PatternLayout> 
     <pattern>%d %p %c{1.} [%t] %m%n</pattern> 
     </PatternLayout> 
     <TimeBasedTriggeringPolicy /> 
    </RollingFile> 
    </Appenders> 
    <Loggers> 
    <Root level="debug"> 
     <AppenderRef ref="Console"/> 
     <AppenderRef ref="RollingFile"/>   
    </Root> 
    </Loggers> 
</Configuration> 
+0

Ich bin mir nicht sicher, ob dies möglich ist, ohne eigene Erweiterungen zu rollen. Es sieht jedoch so aus, als ob Sie eine Datenstruktur protokollieren, ja? Wenn ja, warum nicht eine Methode schreiben, die Sie stattdessen aufrufen würden, die den Benutzernamen aus der Datenstruktur löscht, bevor Sie ihn protokollieren? – Jeremy

+0

@ Jeremy Danke für die Antwort. Eine Sache, die ich erreichen wollte, war die einfache Konfigurierbarkeit. So könnte ich einem Endbenutzer erlauben, bestimmte Felder zu erlauben/zu verbieten, indem man die log4j2-Konfiguration ändert, wenn eine solche Einrichtung bereits als Teil des Pakets verfügbar war. Ich begann auch, eine Kopie der Datenstruktur zu filtern, um diesen Protokolltyp zu erzeugen. Übernehmen Sie die Feldnamen wahrscheinlich über ThreadContext in log4j2 und filtern Sie die Schlüssel und Werte der Felder, bevor Sie sie in ein laufendes Dateiprotokoll schreiben. Nicht sicher, ob andere elegante Ansätze verfügbar sind? – user46743

Antwort

1

Dies kann mit einem RewriteAppender erreicht werden.

Möglicherweise müssen Sie eine benutzerdefinierte RewritePolicy schreiben, die die LogEvent-Nachricht überprüft und die Nachricht durch eine andere Instanz ersetzt, wenn die formatierte Nachricht einen regulären Ausdruck enthält, den Sie herausfiltern möchten.

Ihre benutzerdefinierte RewitePolicy kann in der Konfiguration wie jeder andere Standard Log4j2 plugin konfiguriert werden.

+0

Vielen Dank! Prüfe es und aktualisiere den Thread. – user46743

+0

Es scheint zu funktionieren. In ähnlicher Weise, für Fälle, in denen ich eine Zeichenfolge csv wie Muster anstelle einer Karte zu loggen, ich denke, ich muss möglicherweise auf Regex ersetzen mit PatternLayout Ansatz zurückgreifen? – user46743

Verwandte Themen