C# NLog无输出问题排查:代码配置为何不生效?
问题排查与解决
1. 日志器名称与规则不匹配
NLog的日志规则是按日志器名称匹配的,如果获取日志器时用的名称和规则里定义的不对应,规则根本不会生效。比如你规则里指定的是"FileConsoleLogger",但代码里用LogManager.GetCurrentClassLogger()(默认用类全名当日志器名称),这时候规则对这个日志器无效,自然IsInfoEnabled会是false。
解决:获取日志器时明确指定规则对应的名称,比如:
var fileConsoleLogger = LogManager.GetLogger("FileConsoleLogger"); var memoryLogger = LogManager.GetLogger("MemoryOnlyLogger");
2. 配置未应用到LogManager
代码创建完NLog配置对象后,必须赋值给LogManager.Configuration,否则配置不会生效,NLog会用默认的全局配置(默认级别可能是Warn及以上,Info会被过滤)。
示例完整配置代码:
// 创建日志目标 var consoleTarget = new ConsoleTarget("consoleTarget"); var fileTarget = new FileTarget("fileTarget") { FileName = "${basedir}/logs/app_${shortdate}.log", Layout = "${longdate} ${level} ${logger} ${message}" }; var memoryTarget = new MemoryTarget("memoryTarget"); // 创建日志规则:指定日志器名称、最低级别、关联目标 var fileConsoleRule = new LoggingRule("FileConsoleLogger", LogLevel.Info, consoleTarget, fileTarget); var memoryRule = new LoggingRule("MemoryOnlyLogger", LogLevel.Info, memoryTarget); // 组装配置并应用 var config = new LoggingConfiguration(); config.AddTarget(consoleTarget); config.AddTarget(fileTarget); config.AddTarget(memoryTarget); config.LoggingRules.Add(fileConsoleRule); config.LoggingRules.Add(memoryRule); // 关键步骤:将配置绑定到NLog全局管理器 LogManager.Configuration = config;
3. 全局日志级别被限制
检查LogManager.GlobalThreshold的值,如果它被设置为LogLevel.Warn或更高级别,会全局过滤掉Info及以下的日志,导致IsInfoEnabled为false。
解决:确保全局阈值不高于Info级别:
LogManager.GlobalThreshold = LogLevel.Trace; // 或者直接设为LogLevel.Info
4. 日志器被手动设置了级别覆盖
如果代码里给日志器设置了OverrideMinLevel,比如:
fileConsoleLogger.OverrideMinLevel = LogLevel.Warn;
这会覆盖规则里的级别设置,导致Info日志被禁用,IsInfoEnabled为false。
解决:检查代码中是否有类似设置,移除或调整为合适级别。
5. 规则的级别范围设置错误
确认日志规则的最低级别是LogLevel.Info,而不是LogLevel.Warn或更高。另外不要误设LoggingRule的Final属性为true(除非明确需要阻断后续规则),避免影响当前规则的生效。
内容的提问来源于stack exchange,提问作者jokey
相关产品推荐
相关产品推荐

