簡體   English   中英

Nlog 5.0 更新:未應用配置

[英]Update to Nlog 5.0: Configuration not applied

從 NLog 4.7.15 升級到 5.0.1 時,我在我們的代碼庫中發現了這個測試:

        [Test]
        public void CustomLogFactoryShouldBehaveCompletelyIndependent()
        {
            var memoryTarget4 = new MemoryTarget();
            memoryTarget4.Layout = "${level}|${logger}|${message}${exception}";
            var memoryTarget5 = new MemoryTarget();
            var customConfig = new LoggingConfiguration();
            customConfig.AddTarget("UnitTestLogger4", memoryTarget4);
            customConfig.LoggingRules.Add(new LoggingRule("UnitTestLogger4", LogLevel.Trace, memoryTarget4));
            customConfig.AddTarget("UnitTestLogger2", memoryTarget5);
            customConfig.LoggingRules.Add(new LoggingRule("UnitTestLogger2", LogLevel.Info, memoryTarget5));

            using (var customFactory = new LogFactory(customConfig)) // <<-- This ctor is marked obsolete
            {
                // Log logger defined only in custom config
                var logger4 = customFactory.GetLogger("UnitTestLogger4");
                logger4.Trace("Test4");
                Assert.That(memoryTarget4.Logs.Count, Is.EqualTo(1));
                Assert.That(memoryTarget5.Logs, Is.Empty);
                memoryTarget4.Logs.Clear();

               //... More cases tested here
           }
      }

該測試在舊版本和新版本中都可以正常工作,但只有在我為構造函數LogFactory(LoggingConfiguration)禁用棄用警告 CS0618 之后。

為了解決這個問題,我嘗試使用建議的替代方法LoggingConfiguration(LogFactory) ,它基本上以相反的方式連接工廠和配置。

        [Test]
        public void CustomLogFactoryShouldBehaveCompletelyIndependent()
        {
            var memoryTarget4 = new MemoryTarget();
            memoryTarget4.Layout = "${level}|${logger}|${message}${exception}";
            var memoryTarget5 = new MemoryTarget();

            using (var customFactory = new LogFactory())
            {
                var customConfig = new LoggingConfiguration(customFactory);
                customConfig.AddTarget("UnitTestLogger4", memoryTarget4);
                customConfig.LoggingRules.Add(new LoggingRule("UnitTestLogger4", LogLevel.Trace, memoryTarget4));
                customConfig.AddTarget("UnitTestLogger2", memoryTarget5);
                customConfig.LoggingRules.Add(new LoggingRule("UnitTestLogger2", LogLevel.Info, memoryTarget5));
                // customFactory.ReconfigExistingLoggers(); // <<-- Adding this changes nothing

                // Log logger defined only in custom config
                var logger4 = customFactory.GetLogger("UnitTestLogger4");
                logger4.Trace("Test4");
                Assert.That(memoryTarget4.Logs.Count, Is.EqualTo(1)); // <<-- Fails here, nothing was added to memoryTarget4.
                Assert.That(memoryTarget5.Logs, Is.Empty);
                memoryTarget4.Logs.Clear();
           }
      }

至少這是我認為應該改變的。 但是現在測試失敗了。 未應用配置,因為目標未獲取任何日志。

我錯過了什么? 在這里替換已棄用的LogFactory(LoggingConfiguration)構造函數的正確方法是什么?

構造函數new LogFactory(customConfig)已過時,以確保LoggingConfiguration.Factory具有預期值(使用預期的隔離LogFactory而不是全局 static LogManager.Factory

您可以更換:

customFactory.ReconfigExistingLoggers();

有了這個,配置被激活:

customFactory.Configuration = customConfig;

替代你可以這樣做:

using var customFactory = new NLog.LogFactory().Setup().LoadConfiguration(builder => {
   var memoryTarget4 = new MemoryTarget();
   memoryTarget4.Layout = "${level}|${logger}|${message}${exception}";
   var memoryTarget5 = new MemoryTarget();
   builder.Configuration.LoggingRules.Add(new LoggingRule("UnitTestLogger4", LogLevel.Trace, memoryTarget4));
   builder.Configuration.LoggingRules.Add(new LoggingRule("UnitTestLogger2", LogLevel.Info, memoryTarget5)));
}).LogFactory;

var logger4 = customFactory.GetLogger("UnitTestLogger4");
logger4.Trace("Test4");
Assert.That(memoryTarget4.Logs.Count, Is.EqualTo(1));
Assert.That(memoryTarget5.Logs, Is.Empty);
memoryTarget4.Logs.Clear();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM