2016-10-22 100 views
0

我試圖找出一種方法將屬性注入到log4net的LoggingEvent中。每經測井方法創建一個事件時,如:將屬性注入到log4net的LoggingEvent中

log.Warn(...); 
log.Info(...); 
log.Error(...); 

我希望能夠將屬性添加到所創建的LoggingEvent所,屬性屬性。

使用反射器我可以看到,當調用日誌方法時,如果事件的級別等於或超過記錄器上設置的閾值,它最終實例化LoggingEvent實例。此LoggingEvent具有PropertiesDictionary類型的Properties屬性,基本上是名稱/值對的映射。我希望能夠添加屬性到該字典,而無需用戶進行任何額外的調用。

我能想到這樣做的唯一方法是如果我以某種方式包裝從LogManager.GetLogger()返回的記錄器。我不介意這樣做,但它不能通過代碼,我需要通過log4net配置來實現。我一直在四處搜尋,看不到任何通過配置來包裝東西的方式。

我認爲它也可以將屬性添加到線程上下文對象中,但是這又必須自動發生,而不需要用戶通過代碼來完成。有沒有辦法讓我通過配置掛鉤到線程上下文對象,這樣每次爲日誌語句創建上下文時,我的一些代碼就會被調用?

感謝, 尼克

回答

0

看來你正在尋找的堆棧功能在log4net的:stacks log4net

堆棧使您能夠在上下文中添加信息,並與您的郵件記錄它:

using(log4net.ThreadContext.Stacks["NDC"].Push("context")) 
{ 
    log.Info("Message"); 
} 

這會在日誌輸出中添加「上下文」,您必須將其添加到日誌行格式化程序中。

+0

不,這不會工作,因爲用戶必須編碼。我正在尋找一種方法讓我注入我自己的代碼,以便每次創建LoggingEvent時都可以爲其添加屬性。 – nickdu