2012-09-18 21 views
3

我是nlog的新手,如果我遺漏了一些微不足道的東西,請原諒我的無知。使用nlog的多個版本

我主持了幾個使用IIS7的應用程序,一些使用nlog 1.0.0.505,一些使用NLog 2.0。我不知道如何創建一個web.config來適應這兩個版本。

是否可以將幾個版本的nlog.dll放入GAC中,以便每個應用程序都有一個可供選擇的版本列表?

從GAC中刪除nlog並讓應用程序使用它部署的nlog可能是一個更好的主意嗎?在這種情況下,我如何在web.config中引用nlog(設置目標等)

非常感謝任何幫助或指向我可以閱讀更多內容的地方。

在此先感謝。

回答

3

您需要爲每個應用程序或至少爲使用不同版本的依賴dll的每個應用程序創建單獨的應用程序域。單個應用程序域無法加載同一dll的多個版本。

1

我們最終讓應用程序提供了nlog.dll文件,並沒有在全局web.config中指定版本號。

0

一番激戰後...

,讓我們開始通過說的GAC(全球Assymbly緩存)被髮明的原因是1使用多個(如果u不想故事只是下面的代碼複製)版本的dll在同一個地方。

so..i有一個與NLog 2.0的Sharepoint項目,我需要添加第二個解決方案與dll依賴於NLog 3.2,問題是,在全部推向GAC後(對於開發人員來說,安全控制系統)記錄器從未登錄過新的解決方案。

當我在我的web.config又看了看圍着鍾

<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c" /> 

通知的版本= 2.0.0.0

所以後來我得到了NLOG只是用來加載舊的配置proj,並以某種方式不會通過它時,開始使用3.2的DLL。

我也試圖重新加載配置,做DeepCopy,不能理解爲什麼沒有工作。

然後我在代碼中重新定義LoggingConfiguration以重新初始化記錄器,同時保存舊的配置,登錄該類,然後重複在Destructor中重新初始化舊配置。

我猜測結果是記錄器現在在2.0配置中使用3.2。

但後來我討厭2件事:1 - 有一個析構函數,2 - 沒有從網絡配置。配置,並試圖做所有的海峽沒有工作,並觀察到有一些延遲有時與日誌我認爲有可能是一些隊列或我Finnaly什麼東西找到正確的方式來做一個CTOR,將知道重新初始化在NLOG適當:

public EncryptEventReceiver() 
    { 
     oldConfig = LogManager.Configuration; 

     Task t = new Task(() => 
     { 
      FileTarget target = new FileTarget(); 
      target.FileName = "c:\\Data\\Logs\\MyProj\\EncryptEventReceiver.txt"; 
      target.Layout = "${message}"; 
      target.Encoding = Encoding.UTF8; 

      LoggingRule rule = new LoggingRule("*", LogLevel.Trace, target); 

      LoggingConfiguration config = new LoggingConfiguration(); 
      config.AddTarget("FileLog", target); 
      config.LoggingRules.Add(rule); 

      LogManager.Configuration = config; 

      var _logger = LogManager.GetCurrentClassLogger(); 
      _logger.Trace("EncryptEventReceiver CTOR initialized Logger"); 
     }); 

     t.Start(); 
     t.Wait(); 

     LogManager.GetCurrentClassLogger().Trace("EncryptEventReceiver MIDDLE"); 
     LogManager.Configuration = oldConfig; 
     nlog3 = LogManager.GetCurrentClassLogger(); 
     nlog3.Trace("EncryptEventReceiver CTOR done, nlog3 ready"); 
    } 

編輯: 在引起了一些日誌,錯過了年底,所以我回到了CTOR-Destrucor,對於較重的使用喝Web的配置建議

public static Logger nlog3; 
    private static LoggingConfiguration oldConfig; 

    public EncryptEventReceiver() 
    { 
     oldConfig = LogManager.Configuration; 

     FileTarget target = new FileTarget(); 
     target.FileName = "c:\\Data\\Logs\\MyProj\\EncryptEventReceiver.txt"; 
     target.Layout = "${date:format=yyyy-MM-dd HH\\:mm\\:ss} ${level} ${message} ${exception:format=tostring}"; 
     target.ArchiveAboveSize = 5242880; 
     target.ArchiveFileName = "c:\\Data\\Logs\\MyProj\\Archive_EncryptEventReceiver\\EncryptEventReceiver_${shortdate}_{#}.txt"; 
     target.Encoding = Encoding.UTF8; 

     LoggingRule rule = new LoggingRule("*", LogLevel.Trace, target); 

     LoggingConfiguration config = new LoggingConfiguration(); 
     config.AddTarget("FileLog", target); 
     config.LoggingRules.Add(rule); 

     LogManager.Configuration = config; 

     nlog3 = LogManager.GetCurrentClassLogger(); 
     nlog3.Trace("EncryptEventReceiver CTOR done, nlog3 ready"); 
    } 

    ~EncryptEventReceiver() 
    { 
     nlog3.Trace("EncryptEventReceiver Destructor"); 
     LogManager.Configuration = oldConfig; 
     LogManager.GetCurrentClassLogger().Trace("EncryptEventReceiver Destructor done"); 
    }