来自不同项目的 NLog
NLog from different project
我在单个项目中使用了更多的 NLog 实例(请参阅我之前的问题 )。然而,它并没有像预期的那样工作。
如果我调用在第二个项目中记录的方法,它会正确记录,但即使在返回到上一个项目后,项目也会记录在错误的位置。
因此,例如 Project1 已设置为登录 Project1.log,第二个也是如此。我可以做简单调用的方法:
Project1.Log.Write("1");
Project2.Log.Write("2");
Project1.Log.Write("3");
当我查看日志时,project1 包含“1”,project 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);
}
}
我做错了什么?
您之前的问题谈到应用程序应该优先加载整个应用程序的单个配置:
- 特定应用程序exe.nlog
- 回退到全局 nlog.config
现在您谈论的是在同一个应用程序中有多个程序集,它们想要并排加载它们各自的 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
我在单个项目中使用了更多的 NLog 实例(请参阅我之前的问题
如果我调用在第二个项目中记录的方法,它会正确记录,但即使在返回到上一个项目后,项目也会记录在错误的位置。
因此,例如 Project1 已设置为登录 Project1.log,第二个也是如此。我可以做简单调用的方法:
Project1.Log.Write("1");
Project2.Log.Write("2");
Project1.Log.Write("3");
当我查看日志时,project1 包含“1”,project 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);
}
}
我做错了什么?
您之前的问题谈到应用程序应该优先加载整个应用程序的单个配置:
- 特定应用程序exe.nlog
- 回退到全局 nlog.config
现在您谈论的是在同一个应用程序中有多个程序集,它们想要并排加载它们各自的 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