来自不同项目的 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