2017-01-20 53 views
0

我想記錄我的服務器在日誌文件中的請求/響應。我正在使用Springboot +球衣2.x + log4j2。我註冊了球衣的LoggingFeature這樣的 -如何將Log4j2 ThreadContext值注入Jersey的LoggingFeature

jerseyConfig.register(
    new LoggingFeature(
      java.util.logging.Logger.getLogger(
        LoggingFeature.DEFAULT_LOGGER_NAME), 
      java.util.logging.Level.SEVERE, 
      LoggingFeature.Verbosity.PAYLOAD_ANY, 
      Integer.MAX_VALUE) 
); 

log4j2.xml

<!-- Jersey logger --> 
<AsyncLogger name="org.glassfish" level="all" additivity="false"> 
    <AppenderRef ref="Console" level="off" /> 
    <AppenderRef ref="RollingFileIO" level="error" /> 
</AsyncLogger> 

圖案,我注射事務id與log4j2的ThreadContext的幫助。我在我的pom.xml中有log4j-jul 2.1,並且正在運行它

-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager

事情工作正常,唯一的問題是,在球衣的日誌中,我無法插入交易ID。我嘗試使用我的自定義代碼進行utils日誌記錄,並且能夠將transaction-id放入其中。但在球衣寫入這些日誌時,ThreadContext被清除並且事務ID值變空。

+0

你是什麼意思「無法插入交易ID」?錯誤?不清楚使用哪種API(或者API是否存在)? –

+0

我的意思是,在運動員編寫這些日誌時,ThreadContext被我的代碼清除。對於任何http請求,我生成transaction-id並將其放入ThreadContext中,並在響應結束時將其清除。澤西在這些事件之前和之後寫道。我通過自己的日誌記錄嘗試了java.util.logging,併成功地將事務ID置於日誌中。 – theGamblerRises

回答

0

如果日誌流JUL->log4j2->FooAppender->Layout->ThreadContext.pop然後

Including the ThreadContext when writing logs

的的PatternLayout提供機制打印ThreadContext地圖和堆棧的內容。

  • 使用%X本身包括地圖的全部內容。使用%X{key}來包含指定的密鑰。
  • 使用%x來包含堆棧的全部內容。

如果流量log4j2->JUL->FooHandler->Formatter->ThreadContext.pop那麼你必須安裝或創建一個格式化是知道ThreadContext的。您還必須確保在此配置中log4j2->ThreadContext.pop->JUL->FooHandler->Formatter未發生,因爲在達到JUL之前,它將忘記所有信息。

文檔中的所有示例顯示在調用記錄器之前已設置ThreadContext。這意味着您必須在任何澤西島代碼執行之前設置ThreadContext

+0

如果我編寫自己的utils logging,我可以從ThreadContext獲取值。我期待在球衣的代碼執行之前找到設置ThreadContext的方法。 – theGamblerRises

0

我沒有詳細看過澤西島,但從問題描述看來,它似乎有一個線程模型,使得使用ThreadContext難以工作。

幸運的是,Log4j 2.7提供了一種工具,可讓您將鍵值對(例如ID)插入來自其他源的日誌事件中,而不是ThreadContext。這是爲了幫助像Finagle這樣的異步框架而推出的,因此它對澤西也很有用。

Log4j2手冊在Custom ContextDataInjectors部分簡要介紹了該功能。

如果您想使用此工具,您需要編寫自定義ContextDataInjector並通過指定ContextDataInjectorFactory來告訴Log4j使用該注入器而不是默認注入器。您的自定義注入器需要從某處獲取鍵值對。在Jersey的情況下,RequestContext.getProperty和setProperty是否合適?

相關問題