2012-03-15 52 views
2

我正在嘗試使用NLog記錄系統中的某些內容。這是一個非常複雜的系統,在不同地方使用消息隊列進行多線程。NLog - 擴展Nlog - callsite - dispose()

我們需要擴展NLog來記錄我們需要的其他項目。 擴展NLog之後,我們發現callsite信息是錯誤的。 Stack上的一些搜索給了我一個解決方案。 我現在擔心的是,隨着我們所做的擴展(傳遞TypeName),我們可能會有幾百個日誌實例,並且我很不情願這樣做會非常快速地備份。

我沒有看到NLog的dispose方法,所以我不知道垃圾回收會如何挑選它。

如果我有100個班,每個在不同的線程處理1000個事務第二運行,並且每個這些被記錄,並創建一個新的日誌實例,我看到我的未來問題。

我很樂意提供建議。請讓我知道這是否會成爲問題,如果有的話,可能的解決方案?

編輯:添加代碼: - 這裏是ExtenderClass(取類名)

private readonly Logger _logger; 

     public NLogLogger(Type t) 
     { 
      _logger = LogManager.GetLogger(t.FullName); 
     } 
     public void Trace(string message, string systemUserID, string transactionID, string description) 
     { 
      if (_logger.IsTraceEnabled) 
       { 
        Write(LogLevel.Trace, message, systemUserID, transactionID, description); 
       } 
     } 

下面是一個使用它的類 - 這個類將在實例爲每個線程任務,所以也許500忙碌的一天。

public class ThreadTask : TaskBase 
    { 
     private readonly NLogLogger _logger = new NLogLogger(typeof(ThreadTask));  
     public Method(string val) 
      { 
       _logger.Trace(message); 
      } 
    } 

回答

0

與NLOG(與log4net的爲此事)創建記錄器的實例典型的模式是做這樣的事情在每個等級:

public class MyClass 
{ 
    private static readonly Logger logger = LogManager.GetCurrentClassLogger(); 

    public void DoSomething() 
    { 
    logger.Debug("Hello from inside DoSomething"); 
    } 
} 

這樣,只有一個記錄器每個類實例化的實例(具有如上創建的記錄器)。所以,不應該因爲大量的類實例被創建而造成過多的記錄器被創建。此外,由於典型模式是使用靜態記錄器實例,記錄器將在應用程序的整個生命週期(或者AppDomain)中保持有效,因此不需要Dispose。

+0

是的,你是對的。但我擴展nLog,所以我有一個基類。我必須將該類型傳遞給基類以使該調用點正確。 – bugnuker 2012-04-26 19:53:04

+1

我不明白你有什麼問題。你爲什麼要有幾百個日誌實例?通過聲明你的記錄器類似於我上面說明的方式(考慮到你已經記錄了記錄器的事實),你應該在你的應用程序中爲每個類記錄一個實例。因此,如果您有1個類(將記錄器作爲靜態成員)並且創建了100個類的實例,則只有1個記錄器實例。你能發表一些代碼來展示你如何在你的類中聲明和創建記錄器嗎? – wageoghe 2012-04-26 21:08:32

+0

在原始問題中增加了代碼 – bugnuker 2012-04-26 22:50:16