2017-03-07 62 views
1

是否可以配置Log4j2,以便過濾器或其他組件可以過濾出在日誌中打印的某些值? (但應允許在同一線路的其它領域通過)在Log4j2中,是否可以根據密鑰從記錄器中篩選出某些鍵值對?

說出以下行出現在日誌

[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 

現在我可以過濾掉「username」的字段,這樣的方式在日誌中線現在不包含它如下所示?

[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 

這裏是我的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

我不確定這是否可能,而無需滾動自己的擴展。然而,它看起來像你的日誌數據結構,是嗎?如果是這樣,爲什麼不寫一個你會調用的方法,它會在登錄之前從數據結構中刪除用戶名? – Jeremy

+0

@Jeremy謝謝你的迴應。我期望實現的一件事是「可配置性」的簡化。就像我可以允許最終用戶通過更改log4j2配置來允許/禁止某些字段,如果這樣的設施已經可以作爲包的一部分。我還開始過濾專門用於生成此類日誌的數據結構副本。可能通過log4j2中的ThreadContext獲取字段名稱,並在將其寫入滾動文件日誌之前過濾字段的鍵和值。不確定是否有其他優雅的方法可用? – user46743

回答

1

這可以用RewriteAppender來完成。

您可能需要編寫一個自定義RewritePolicy,檢查LogEvent的消息,並在格式化消息中包含要過濾的正則表達式的情況下,將消息替換爲另一個實例。

您的自定義RewitePolicy可以配置爲像其他任何標準Log4j2 plugin一樣。

+0

非常感謝!將檢查出來並更新線程。 – user46743

+0

它似乎工作。在類似的說明,對於我有一個字符串CSV模式記錄而不是地圖的情況下,我想我可能不得不退回到使用PatternLayout方法的正則表達式替換? – user46743