2014-07-22 131 views
1

我正在製作車輛跟蹤應用程序(ASP.NET MVC C#)。我有Windows服務,需要GPS設備發送的數據。在服務中,我編寫了用於記錄數據的代碼。Log4Net寫入不同的文件

現在考慮一個正常的日誌情況,其中我只有一個GPS設備。

8時00分24秒內OnDataAvailable方法

8時00分25秒的數據接收 - 設備ID:2數據:ABCDEFGHIJKL

8時00分25秒離開OnDataAvailable

以及更多的陳述。然後它重複


現在,當我有多個GPS設備發送數據時,日誌會混合在一起。也就是說我有以下類型的日誌:

八時00分23秒內OnDataAvailable方法8點00分24秒內OnDataAvailable 方法

8點00分25秒的數據接收 - 設備ID:2數據: ABCDEFGHIJKL

八時00分25秒離開OnDataAvailable

8時00分26秒的數據接收 - 設備ID:1數據:ABCDEFGHIJKL

8時00分26秒離開OnDataAvailable

現在我想實現的是,我應該爲不同的設備有不同的日誌文件。因此,對於ID爲1的設備,我有Log_D1.txt,對於Device Id 2,Log_D2.txt。

如果有人能指出我正確的方向,將不勝感激。

回答

2

您應該可以使用其中一個上下文對象(如ThreadContext.Properties)來構建文件名。您可以配置日誌文件名稱以使用屬性來建立名稱。所以,就你而言,你可能會將設備ID存儲在上下文中(你的請求是否在單獨的線程中處理?)。

這篇文章有如何工作的一個很好的解釋:

http://geekswithblogs.net/rgupta/archive/2009/03/03/dynamic-log-filenames-with-log4net.aspx

總之,你可以配置你的appender是這樣的:

<appender name="RollingFileAppenderV1" type="log4net.Appender.RollingFileAppender"> 
    <file type="log4net.Util.PatternString" value="F:\HornetFeed\Log_%property{DeviceID}" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="-1" /> 
    <maximumFileSize value="5000KB" /> 
    <staticLogFileName value="true" /> 
    <countDirection value="1"/> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%m%n" /> 
    </layout> 
    <filter type="log4net.Filter.PropertyFilter"> 
     <Key value="Version" /> 
     <StringToMatch value="1" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
</appender> 

注意在使用%property文件名說明。

然後,在你的代碼,你可以做這樣的事情:

private void OnDataAvailable(string id, int data) 
{ 
    ThreadContext.Properties["DeviceID"] = id; 

    logger.Info("Inside OnDataAvailable"); 

    logger.Info("Leaving OnDataAvailable"); 
} 

所有日誌消息,至少在該DeviceID屬性已設置的情況下,應該被隔離到分隔的文件,命名,在部分,由DeviceID。

+0

是的,有多個線程,因爲如果有多個線程寫在同一個日誌文件上,它將只會混亂起來。 –

+0

我想我們需要寫log4net.Config.XmlConfigurator.Configure();使其工作。 –