gpt4 book ai didi

c# - 来自不同项目的 NLog

转载 作者:太空宇宙 更新时间:2023-11-03 22:44:47 25 4
gpt4 key购买 nike

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

我做错了什么?

最佳答案

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

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

关于c# - 来自不同项目的 NLog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50491190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com