.NET Core 5.0 WPF应用NLog配置双文件日志出现内容重复问题
问题根因
NLog的LoggingRule构造函数第一个参数是logger名称匹配模式,你最初的配置中两个规则的匹配模式都设为了*,代表所有名称的logger产生的日志都会同时命中这两个规则,自然会同时写入两个关联的文件中。
你后续修改后添加了Final=true理论上已经符合功能要求,如果仍然出现交叉写入的情况,大概率是配置未正确重新加载、有额外的其他名称日志输出命中了通配规则,或存在其他位置的配置代码覆盖了当前设置。
正确配置方案
按照「指定名称的logger仅写入对应独立文件」的需求,规则配置如下即可:
private void SetupLogger() { var config = new LoggingConfiguration(); // 定义两个文件输出目标 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(firstTarget); config.AddTarget(secondTarget); // 规则1:仅匹配名称为FirstLogger的日志,写完终止后续匹配 var ruleInfo1 = new LoggingRule("FirstLogger", NLog.LogLevel.Trace, firstTarget) { Final = true }; // 规则2:仅匹配名称为SecondLogger的日志,写完终止后续匹配 var ruleInfo2 = new LoggingRule("SecondLogger", NLog.LogLevel.Trace, secondTarget) { Final = true }; // 可选规则:如果需要处理其他名称的日志,可以添加对应的通配规则,放在所有精确匹配规则之后即可 // var defaultRule = new LoggingRule("*", NLog.LogLevel.Trace, otherTarget); config.LoggingRules.Add(ruleInfo1); config.LoggingRules.Add(ruleInfo2); // config.LoggingRules.Add(defaultRule); LogManager.Configuration = config; }
注意规则添加顺序必须是精确匹配规则在前,通配规则在后,否则通配规则会先命中所有日志,导致后续精确规则失效。
验证方法
添加测试代码确认日志隔离效果:
// 只会写入log1.txt var logger1 = LogManager.GetLogger("FirstLogger"); logger1.Info("FirstLogger专属日志"); // 只会写入log2.txt var logger2 = LogManager.GetLogger("SecondLogger"); logger2.Info("SecondLogger专属日志");
内容的提问来源于stack exchange,提问作者CiucaS
相关产品推荐
相关产品推荐

