我试图从"普通"内部进行一些非常具体的记录。将被多个Web应用程序使用的类库。 "消费" Web应用程序可能会也可能不会对自己进行一些NLog日志记录。我想以某种方式隔离日志记录配置,以便:
到目前为止,我已经设法从类库中以编程方式设置日志记录配置,以便它可以共存"使用来自消费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 };
到目前为止一切顺利。但问题是,当一个消费的Web应用程序有自己的日志记录设置并使用一个全能记录器时,它也会捕获我的特殊记录器输出。像这样:
<logger name="*" minlevel="Info" writeTo="someLogfile" />
我认为这是因为程序化日志配置最终会添加&#34;特殊目标&#34;在现有的记录器列表的末尾,所以整个&#34; final = true&#34;实际上并没有帮助。初看起来,我没有找到在特定索引处添加目标的方法。但如果有人有办法,请告诉我。
或者,如果有人对如何从公共类库中隔离日志记录有其他想法,请告诉我。
答案 0 :(得分:1)
//config.LoggingRules.Add(specialRule); // old way
config.LoggingRules.Insert(0, specialRule); // new way
我过分关注LoggingRules.Add(...)
无法指定索引,我完全错过了Insert(int index, LoggingRule item)
方法。
我希望有一天能帮助其他人寻找类似的东西。