2017-03-23 63 views
1

我有一羣不同的Akka actor,都使用logback作爲記錄器。在純阿卡演員啓動時,我可以在應用程序初始化過程中做到這一點:將全局自定義值添加到Play Framework記錄器

MDC.put("role", role) 

作用是代表過程的主要作用的字符串(如「工人」),並且所有的日誌都會有這種額外的上下文值,幫助調查。

其中一個角色是前端,並使用Play框架發佈REST API。在這種情況下,我沒有定義一個擴展App的對象,並且我不知道如何/如何設置全局值,以便在播放應用程序中發出的所有日誌都標有角色(以及其他我想要的東西放)。

回答

1

Play是一個多線程應用程序,因此在這裏使用MDC不會有效工作。您可以做的最好的事情是使用SLF4J標記API,它可以在線程之間傳遞。

Play 2.6.x將支持the Marker API directly,但同時您應該直接使用SLF4J來利用Logstash Logback Encoder來創建包含角色和其他信息的豐富標記。

import static net.logstash.logback.marker.Markers.* 

Marker logstashMarker = append("name", "value"); 
private val logger = org.slf4j.LoggerFactory.getLogger(this.getClass) 
logger.debug(logstashMarker, "My message") 

然後,您可以將logstashMarker作爲隱式參數傳遞給您的方法,而不用擔心線程本地信息。

請注意,Play會處理請求,因此您在Play中需要的任何「全局」信息都將被提取並添加 - 爲了最大限度的方便,您可以使用動作組合或WEP將這些信息放入WrappedRequest中添加一個過濾器。

+0

謝謝!我的理解是系統下面寫的日誌(例如Akka)永遠不會有這個標記,對吧? – CanardMoussant

+0

如果您使用的是akka.event.Logging,那麼標記支持在2.4.x中不可用。它應該在2.5.0中可用:請參閱https://github.com/akka/akka/issues/21671 –

相關問題