【问题标题】:NLog from different project来自不同项目的 NLog
【发布时间】:2018-05-23 14:38:03
【问题描述】:

我在单个项目中使用了更多的 NLog 实例(请参阅我之前的问题 Nlog config file priority)。但是,它并没有按预期工作。

如果我调用登录第二个项目的方法,它会正确记录,但即使在返回上一个项目后,项目也会被记录在错误的位置。

因此,例如 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);
    }
}

我做错了什么?

【问题讨论】:

  • 您修改静态 LogManager.Configuration,它是整个流程的单个实例。有关详细信息,请参阅 Rolf Kristensen 的回答。

标签: c# nlog


【解决方案1】:

您之前的问题是关于应用程序应该优先加载整个应用程序的单个配置:

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

【讨论】:

  • 哈,非常感谢您,先生。我没有意识到 LogManager 是静态的,并且希望它像您在示例中那样被实例化。
猜你喜欢
  • 2019-02-11
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 2019-06-08
  • 2016-01-20
相关资源
最近更新 更多