2015-09-28 177 views
0

我有一個抑制重複消息的過濾器,如果消息在y秒內被看到超過x次z秒。隨着log4j的我已經把一個事件範圍的MDC屬性,它曾經達到閾值,如:log4j2過濾器修改日誌事件?

event.setProperty("prefix", suppressProlog);

在我的佈局,然後我採用了這種模式:

<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss.SSS z}] %p %t %c %X{prefix} %m%n" />

由於此屬性僅限於當前事件,因此我不必擔心清理問題。 與log4j2,事件鏈接的屬性似乎消失了。我將如何實現與使用log4j一樣的行爲?

這是我看到的可能的解決方案,但沒有一個看起來很吸引我:

  • 我可以保持我自己的ThreadLocal財產,清理它被記錄後,但是當它被通過異步記錄什麼記錄器在另一個線程中,或者我怎麼知道這個可以清理?並將抑制邏輯拆分爲過濾器和佈局似乎是錯誤的
  • 看到這個答案https://stackoverflow.com/a/29597669/1377224,似乎不喜歡子類化LogEvent,因此擴展LogEvent以提供一些抑制標誌是行不通的。我也試圖避免這次入侵log4j。
  • 過濾器可以自己記錄一條消息,告訴消息x將被抑制。使用標準記錄器而不是StatusLogger插入日誌消息會是一種好的做法嗎?

什麼是預期模式有過濾影響,日誌輸出?

+0

您是否可以不使用自定義過濾器插件捕獲日誌消息並在篩選器級別實現抑制?內存/性能問題將成爲我的主要擔憂,但我認爲它會起作用。 – alan7678

+0

嗨@ alan7678,我打算把它當作過濾器,就像我用log4j做的一樣。實際的壓制不是問題。麻煩製造者是我找不到用某些調整後的消息字符串記錄消息的方式,通知用戶有關日誌消息的開始抑制。 另一種選擇可能是簡單地讓篩選器記錄關於抑制的另一個消息。 – philnate

+0

這對我來說似乎是個不錯的主意。您可以從我相信的事件中獲取記錄器名稱。 – alan7678

回答

0

LoggerEvent的源代碼顯示,在getProperty和setProperty方法的引擎下,它使用MDC來存儲和獲取屬性。

新類的LogEvent有 地圖getContextMap()

這是從我的POV更換。