【问题标题】:NLog 2 files logging will log same info in both filesNLog 2 文件记录将在两个文件中记录相同的信息
【发布时间】:2021-11-27 17:37:09
【问题描述】:

所以我有一个相当简单的问题,但似乎我错过了一些东西。我有一个 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);

【问题讨论】:

  • 你真正想要实现什么?
  • 我有一个记录重要信息的“通用日志文件”。现在我正在尝试为一些更具体的信息添加另一个记录器(我想记录用户操作和时间)。我知道我可以只拥有一个包含所有内容的文件,但对我来说拥有 2 个文件更有意义。简而言之,一个是hole app的通用日志文件,一个是“用户操作记录”的日志文件
  • 专业化的LoggingRule 应该在列表中的第一位,并且有一个不同于"*" 的过滤器,例如new LoggingRule("FirstLogger",...),并且还将属性Final 设置为true。当您设置完所有这些后,将不会调用带有过滤器 "*" 的其他记录器。
  • 检查我的编辑。我找到了解决方案。将让我重要的记录器低级别成为信息。这样我就可以为我的用户交互记录使用跟踪/调试。这可以工作,但我希望我可以在两个文件中记录每个级别,只需从 LogManager 中选择一个不同的记录器。
  • 我把我的建议放到了你的方法SetupLogger上并调用了,“App正在启动”这个文字只出现在log1.txt文件中。我不清楚“我已经尝试过了,它仍然记录到两个文件”是什么意思。

标签: c# nlog


【解决方案1】:

使用通配符* 作为记录器名称的记录规则将匹配所有记录器:

// 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 - 将警告/错误重定向到 firstTarget(LogLevel 过滤器)
  • ruleUsers - 将写入 LogManager.GetLogger("UserLog") 的事件重定向到 firstTarget(过滤器名称)
  • ruleAll - 将所有事件重定向到 secondTarget(没有任何过滤器)

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

【讨论】:

  • 谢谢,今天会试试这个,如果它有效就接受,看起来像我需要的东西。
【解决方案2】:

没错。

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

您没有抛出任何异常,因此不会记录任何异常。

【讨论】:

  • 然后让我重复我的问题。有没有办法可以记录相同类型的日志信息(例如),但选择应该记录在哪个文件中?
  • 是的,这将是一个解决方案,它看起来像我想要实现的一些开销,但它仍然是一个解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多