2016-02-01 91 views
0

我在我的項目中使用nlog記錄器。使用nlog記錄多個線程

我的程序根據我從sql server獲得的數據生成xml文件。我正在用PLINQ來做這件事。但是我也必須記錄跟蹤信息,以便能夠對產品環境中的特殊情況進行一些調查。

當它來自多個線程時,結果日誌看起來很糟糕。例如:

Operation 1 starded 
Deserializing XXX 
Operation 2 started 
Deserializing XXX finished with status X 
Filling XXX with data from Z 
Deserializing YYY.... 

而且它只是爲並行度2.

我想看到的結果是這樣的:

Operation 1 starded 
Deserializing XXX 
Deserializing XXX finished with status X 
Filling XXX with data from Z 
Operation 1 finished 
Operation 2 started  
Deserializing YYY.... 

我看到一些解決方案,但他們沒有看起來不夠好:

  1. 將日誌數據保存到某個緩衝區並在parralel任務結束時將其刷新 - 我將應該將上下文傳遞給所有內部方法(看起來很可怕!)。
  2. 添加某種preffix記錄消息,以幫助獲取某些消息的上下文 - 我必須將preffix傳遞給每個內部消息(也看起來很糟糕)。

有沒有一些乾淨的解決方案,這個問題?

+0

我認爲記錄事件的實際順序對於錯誤檢測實際上可能是有價值的,因爲多線程環境中的典型錯誤當然是某些意料之外的事件順序。但是爲什麼不在日誌消息前添加一個線程名稱/ ID?日誌記錄可以通過線程中的接口(無論如何這是一個好主意)引導,這可以將前綴添加到實際消息中。這樣,您可以始終對日誌進行後期處理,以便一起查看與特定線程相關的所有消息。 –

+0

我認爲緩衝是一種值得懷疑的記錄策略,因爲導致災難性錯誤的事件可能永遠不會寫入日誌。 –

+0

你可以將所有的日誌寫入併發隊列,然後在不同的線程上出隊? – Enigmativity

回答

5

在NLOG配置文件中有${threadid}語法。使用這樣的:

   <target name="file" xsi:type="File" 
       layout="${longdate} [${threadid}] ${level:uppercase=true} ${message} ${exception:format=tostring}" 
       fileName="${basedir}/logs/log.txt" 
       archiveFileName="${basedir}/logs/log.{#####}.txt" 
       archiveAboveSize="10485760" 
       archiveNumbering="Sequence" 
       concurrentWrites="true" 
       keepFileOpen="false" /> 

更多信息:

https://github.com/NLog/NLog/wiki/ThreadId-Layout-Renderer

我在生產中使用和generaly它的工作原理。這並不完美。

但是所有的操作(我登錄的)都是按順序排列的,這個threadid描述了哪些操作符是在哪個ThreadId中。

+0

它的簡單而乾淨的解決方案,但它需要添加一些過濾和訂購工具。很多與id混合在一起,無法進行額外的文本處理。我正在考慮將此變體保留爲:) – Mitklantekutli

+0

您想創建一個不錯的查看器來記錄文件嗎?這是其他層,它是很多工具來做到這一點。 –

+0

我的問題是關於避免它。 – Mitklantekutli