如何在运行时使用NLog忽略指定日志条目?
在NLog中运行时忽略指定日志条目的正确方式
你之前用MemoryTarget配合Final=true的方法虽然能生效,但确实不够规范——没必要把不需要的日志先写入内存再丢弃。而你尝试的ConditionBasedFilter之所以会忽略所有日志,是因为LoggingRule本身已经匹配了Microsoft.*,再叠加过滤器会导致逻辑冲突,最终意外拦截了全部日志。
正确的做法是使用NLog内置的WriteToNil(空目标),直接将不需要的日志丢弃,无需额外创建无用的Target。以下是规范的实现方案:
private void SetUpLogging(string connectionString) { var mongoTarget = new MongoTarget { Name = "mongolog", ConnectionString = connectionString, CollectionName = "ApiLog", IncludeDefaults = true, IncludeEventProperties = true, DatabaseName = "Log", CappedCollectionSize = 20000000 }; LogManager.Setup().LoadConfiguration(c => { // 忽略Microsoft开头的、级别低于Warn的日志(直接丢弃) c.ForLogger("Microsoft.*").WriteToNil(LogLevel.Warn); // 其他所有日志,最低级别Debug,写入MongoDB目标 c.ForLogger().FilterMinLevel(LogLevel.Debug).WriteTo(mongoTarget); }); }
方案说明:
ForLogger("Microsoft.*")精准匹配所有以Microsoft开头的日志记录器WriteToNil(LogLevel.Warn)表示该规则下,低于Warn级别的日志直接被忽略(不写入任何目标);如果需要忽略所有级别的Microsoft日志,可以改成WriteToNil(LogLevel.Trace, LogLevel.Fatal)- 第二条规则是兜底配置,将所有未被第一条规则匹配的日志,过滤出Debug及以上级别后写入你配置的MongoTarget
这种方式既简洁高效,又符合NLog的设计规范,避免了不必要的资源消耗。
内容的提问来源于stack exchange,提问作者Will Calderwood
相关产品推荐
相关产品推荐

