NLog 2 文件记录将在两个文件中记录相同的信息

NLog 2 files logging will log same info in both files

所以我有一个相当简单的问题,但似乎我遗漏了什么。我有一个 WPF 应用程序 (.NET Core 5.0)。

我正在尝试使用 2 个文件进行日志记录,但每当我检索一个记录器并写入一条消息时,我都会在两个文件中得到相同的日志。

这是我的代码。

        private void SetupLogger()
        {
            // Step 1. Create configuration object 
            var config = new LoggingConfiguration();

            // Step 2. Create targets
            var firstTarget = new FileTarget()
            {
                Name = "FirstLogger",
                FileName = Path.Combine(basePath, "log1.txt"),
                Layout = "${longdate} ${level} ${message}  ${exception}"
            };

            var secondTarget = new FileTarget()
            {
                Name = "SecondLogger",
                FileName = Path.Combine(basePath, "log2.txt"),
                Layout = "${longdate} ${level} ${message}"
            };
            config.AddTarget("FirstLogger", firstTarget );
            config.AddTarget("SecondLogger", secondTarget );


            var ruleInfo1 = new LoggingRule("*", NLog.LogLevel.Trace, firstTarget );
            var ruleInfo2= new LoggingRule("*", NLog.LogLevel.Trace, secondTarget );

            // Step 3. Define rules
            config.LoggingRules.Add(ruleInfo1); 
            config.LoggingRules.Add(ruleInfo2); 

            // Step 4. Activate the configuration
            LogManager.Configuration = config;

            // Example usage
            var logger = LogManager.GetLogger("FirstLogger");
            logger.Info("App starting...");
        } 

在另一个文件中我有第二个日志

        public void Start()
        {
            //initialize app
            var logger = LogManager.GetLogger("FirstLogger");
            logger.Info("App finished initializing...");
        }

现在我在两个文件中看到了两个日志。

LE:我试过了,它仍然记录到两个文件。

  var ruleInfo1 = new LoggingRule("FirstLogger", LogLevel.Trace, firstTarget )
            {
                Final = true
            };           
            var ruleInfo2 = new LoggingRule("*", LogLevel.Trace, secondTarget );

  config.LoggingRules.Add(ruleInfo1); 
            config.LoggingRules.Add(ruleInfo2);

没错。

两个记录器之间的唯一区别是异常。

您没有抛出任何异常,因此 none 将被记录。

带有通配符 * 的记录器名称的记录器规则将匹配所有记录器:

// Step 3. Define rules
var ruleInfo1 = new LoggingRule("*", NLog.LogLevel.Trace, firstTarget );
config.LoggingRules.Add(ruleInfo1);
var ruleInfo2 = new LoggingRule("*", NLog.LogLevel.Trace, secondTarget );
config.LoggingRules.Add(ruleInfo2); 

也许改成这样:

// Step 3. Define rules
var ruleErrors = new LoggingRule("*", NLog.LogLevel.Warn, firstTarget );
config.LoggingRules.Add(ruleErrors);
var ruleUsers = new LoggingRule("UserLog", NLog.LogLevel.Trace, firstTarget );
config.LoggingRules.Add(ruleUsers);
var ruleAll = new LoggingRule("*", NLog.LogLevel.Trace, secondTarget );
config.LoggingRules.Add(ruleAll);

现在 3 条规则将确保:

  • ruleErrors - 将重定向 warnings/errors 到 firstTarget(在 LogLevel 上过滤)
  • ruleUsers - 将写入 LogManager.GetLogger("UserLog") 的事件重定向到 firstTarget(根据 Logger-name 过滤)
  • ruleAll - 将所有事件重定向到 secondTarget(没有任何过滤器)

另请参阅:https://github.com/NLog/NLog/wiki/Configuration-file#rules