【发布时间】:2016-11-07 13:34:01
【问题描述】:
我正在尝试从一个“通用”类库中进行一些非常具体的日志记录,该类库将被多个 Web 应用程序使用。 “消费”的 Web 应用程序可能会或可能不会自己做一些 NLog 日志记录。我想以某种方式隔离日志记录配置,以便:
- 类库中的任何日志记录都不会出现在使用 Web 应用程序配置的目标中
- 使用 Web 应用程序的任何日志记录都不会出现在类库配置的目标中
到目前为止,我已经设法从类库中以编程方式设置日志记录配置,以便它可以与来自消费 Web 应用程序的日志记录配置“共存”。我做了这样的事情:
public static void RegisterLoggingConfiguration()
{
// If there is existing configuration then just use that and update it. Otherwise, create brand new config.
var config = LogManager.Configuration ?? new LoggingConfiguration();
var specialTarget = new FileTarget { FileName = @"C:\Logs\SpecialLog.txt" };
config.AddTarget("specialTarget", specialTarget);
var specialRule = new LoggingRule("SpecialLoggerName", LogLevel.Info, specialTarget) { Final = true };
config.LoggingRules.Add(specialRule);
LogManager.Configuration = config;
}
关键是我按名称定位特定记录器,以便其输出可以定向到特定文件目标。例如,在我的类库中的某处:
var logger = LogManager.GetLogger("SpecialLoggerName");
上面的编程配置中的这一行与名称匹配:
var specialRule = new LoggingRule("SpecialLoggerName", LogLevel.Info, specialTarget) { Final = true };
到目前为止一切顺利。然而,问题是当一个消费网络应用程序有自己的日志设置并使用,比如说,一个包罗万象的记录器时,它也会捕获我的特殊记录器输出。像这样:
<logger name="*" minlevel="Info" writeTo="someLogfile" />
我认为这是因为程序化日志记录配置最终会在现有记录器列表的末尾添加“特殊目标”,因此整个“final=true”实际上并没有帮助。乍一看,我没有找到在特定索引处添加目标的方法。但如果有人有办法做到这一点,请告诉我。
或者,如果有人对如何从公共类库中隔离日志记录有其他想法,请告诉我。
【问题讨论】:
标签: c# asp.net-mvc logging nlog