来自不同项目的NLog

时间:2018-05-23 14:38:03

标签: c# nlog

我在单个项目中使用了更多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);
    }
}

我做错了什么?

1 个答案:

答案 0 :(得分:3)

您之前的问题谈到应用程序应该优先为整个应用程序加载单个配置:

  • 特定于应用程序的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