2011-08-03 96 views
1

我想問問C#專家在這裏尋求建議。我的調試日誌有問題。我有一個簡單的類,只是打開一個文件,寫下提供的字符串並再次關閉文件。但是,有時我需要在使用多線程時使用此調試日誌。從而麻煩來了。我無法打開多個文件,因此我收到一個異常,因爲我只是試圖再次打開鎖定的文件。爲了這個目的,我希望有一些像「緩存調試日誌」這樣可以防止這種異常。有沒有簡單的方法來實現這一點?提前致謝。C#「緩存調試日誌」

回答

2

C#4.0提供線程安全集合,如System.Collections.Concurrent.ConcurrentQueue<T>。你可以修改你的日誌記錄類,使它在自己的線程中運行,並且調用日誌方法只需將消息添加到這樣的隊列中。這樣,您的日誌記錄線程就可以安全地讀取隊列中的項目,並且不中斷地寫入文件。

編輯

當然,最方便的事情是開始使用已經有這個東西的照顧預先存在的日誌框架。我推薦NLog,儘管log4net也是一個有價值的競爭者。

+0

+1爲NLog,我認爲它比log4net好。 – kprobst

1

這通常是通過從代碼的所有部分調用單例記錄器完成的;記錄器是直接訪問文件的唯一東西。有許多已經存在的框架(nlog,log4net,企業庫)可以爲您做到這一點。

+0

感謝您的回答,我的項目不是很複雜,所以我認爲使用類似NLog的東西就像使用機槍殺死一隻蒼蠅:)。 – Danstahr

1

您可能想查看.NET跟蹤。我更喜歡使用內置的TraceSource類,而不是使用像nlog這樣的第三方日誌記錄框架。我曾經走過甚至圍繞nlog編寫門面的道路,但是,擁有如此多的依賴關係以及如此多的抽象層,似乎相當愚蠢,只是爲了寫一條日誌消息。

你可以看到這裏TraceSource的概述:http://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource.aspx

的想法是,你從聽分離出跟蹤。在整個代碼中,可以添加跟蹤調用,每個調用都有不同的日誌級別(錯誤,詳細,調試)和不同的來源。在你的應用程序配置中,你可以配置不同的監聽器。

<system.diagnostics> 
    <sources> 
     <source name="Source1" switchName="verboseSwitch"> 
     <listeners> 
      <add name="console" /> 
     </listeners> 
     </source> 
     <source name="Source2" switchName="warningSwitch"> 
     <listeners> 
      <add name="console" /> 
     </listeners> 
     </source> 
    </sources> 
    <switches> 
     <add name="verboseSwitch" value="Verbose" /> 
     <add name="warningSwitch" value="Information" /> 
    </switches> 
    <sharedListeners> 
     <add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false"/> 
    </sharedListeners> 
    <trace autoflush="true" indentsize="4"> 
     <listeners> 
     <add name="console" /> 
     </listeners> 
    </trace> 
    </system.diagnostics> 


public void MethodOne() 
{ 
    TraceSource ts = new TraceSource("Source1"); 

    ts.TraceEvent(TraceEventType.Verbose, 0, "Called MethodOne"); 

    // do something that causes an error 
    ts.TraceEvent(TraceEventType.Error, 0, "MethodOne threw an error"); 
} 

這裏,MethodOne設置爲使用源「Source1」。 Source1當前配置爲聽取詳細和更高的內容。因此,這意味着

Called MethodOne 
MethodOne threw an error 

會雖然MethodTwo配置爲使用源2,這是隻設置了聽警告及以上的都被寫入到控制檯

public void MethodTwo() 
{ 
    TraceSource ts = new TraceSource("Source2"); 

    ts.TraceEvent(TraceEventType.Verbose, 0, "Called MethodTwo"); 

    // do something that causes a error 
    ts.TraceEvent(TraceEventType.Error, 0, "MethodTwo threw an error"); 
} 

這裏。

因此,代碼運行時,輸出將是

MethodTwo threw an error 

這是什麼讓你做的是控制你要多少信息,看看你的程序的不同部分。也許如果有一天你開始在某個庫中看到錯誤,你可以將該庫的跟蹤源變成冗長的,現在看到你所有的調試信息,而不會被程序其他部分的數據淹沒。

我使用不同的監聽器來控制關鍵錯誤的流程。我有聽衆的某些來源和某些錯誤級別,這些錯誤會在錯誤寫入日誌時給我發電子郵件。例如,我不在乎404錯誤,但我關心註冊碼中發生的任何事情。

你有ConsoleTraceListener寫入到控制檯/調試窗口 的FileLogTraceListener用於寫入文件 即使EventLogTraceListener

你可以看到內置的聽衆here

然後有三分之一的完整列表第三方聽衆發送關於日誌事件的電子郵件,存儲在數據庫中,寫入Azure表存儲等。

你當然可以用類似框架來完成所有這些NLOG。 .NET跟蹤方法具有很高的性能,可以在.NET Framework中使用。選擇它恕我直言,你不會出錯。