我在单个项目中使用了更多NLog实例(请参阅我之前的问题Nlog config file priority)。但是,它没有按预期工作。
如果我调用登录第二个项目的方法,它会被正确记录,但即使在返回上一个项目后,项目也会被记录在错误的位置。
因此,例如,Project1已设置为以第二个方式登录Project1.log。我可以做简单调用的方法:
Project1.Log.Write("1");
Project2.Log.Write("2");
Project1.Log.Write("3");
当我检查日志时,project1包含“1”,项目2包含“2”和“3”。
精确(位简化)记录器类看起来像:
public static class Log
{
private static readonly Lazy<Logger> Logger = new Lazy<Logger>(CreateLogger);
private static Logger CreateLogger()
{
string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
LogManager.Configuration = new XmlLoggingConfiguration(assemblyFolder + "\\ProjectX.exe.nlog", true); //X means project id
return LogManager.GetCurrentClassLogger();
}
public static void Write(object log)
{
Logger.Value.Debug(log);
}
}
我做错了什么?
答案 0 :(得分:3)
您之前的问题谈到应用程序应该优先为整个应用程序加载单个配置:
现在,您正在讨论在同一个应用程序中拥有多个程序集,并希望并行加载各自的NLog配置。
使用静态LogManager.Configuration
时,您将修改整个应用程序的全局配置。如果两个项目组件正在改变全局配置,那么它当然会对其他人产生副作用。
也许你的CreateLogger
看起来像这样:
private static Logger CreateLogger()
{
// Check for global NLog-configuration (Maybe your don't want this at all?)
var configuration = LogManager.Configuration;
if (configuration?.AllTarget.Count > 0)
return LogManager.GetCurrentClassLogger();
// Create assembly-specific NLog-configuration
string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
LogFactory logFactory = new LogFactory();
logFactory.Configuration = new XmlLoggingConfiguration(assemblyFolder + "\\ProjectX.exe.nlog", true, logFactory); //X means project id
return logFactory.GetCurrentClassLogger();
}
另见https://github.com/NLog/NLog/wiki/Configure-component-logging