使NLog.config文件从(d:\dev)加载文件而不是"\bin\debug\"

22

我在特定的DLL中使用Nlog进行日志记录。该DLL然后在另一个应用程序中使用(使用System.Reflection.Assembly.LoadFrom(path + a.dll)进行动态加载)。我手动将Nlog.dll和Nlog.config文件放置在路径文件夹中,应用程序正常运行,但不记录任何消息。

但是,当我手动将Nlog.config文件放置在应用程序目录(\bin\debug\)中时,它会记录消息。

有人能告诉我如何将Nlog.Config的搜索位置指向不同的目录(d:\dev),而不是\bin\debug\

5个回答

59

以下是我如何更改Nlog的配置以指向执行程序集文件夹中存在的Nlog.config文件。

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
NLog.LogManager.Configuration = new NLog.Config.XmlLoggingConfiguration(assemblyFolder + "\\NLog.config");

12
你可以使用 Path.Combine(assemblyFolder, "NLog.config")。 - Egemen Çiftci

6
请参阅NLog Wiki上的配置文件位置
基本上,NLog定位配置的方式有:
  • 标准应用程序配置文件(通常是applicationname.exe.config)
  • 应用程序目录中的applicationname.exe.nlog
  • 应用程序目录中的NLog.config
  • NLog.dll所在目录中的NLog.dll.nlog(仅当NLog不在GAC中时)
  • NLOG_GLOBAL_CONFIG_FILE环境变量指向的文件名(如果定义了,仅限于NLog 1.0 - 在NLog 2.0中删除了支持)
没有其他方法可以做到这一点。

2
有一种方法可以做到这一点,请参见上文 - Ruben Bartelink

4
NLog配置文件需要位于动态拉取a.dll的应用程序所在的文件夹中。 如果你正在进行调试,那么将配置文件放入bin\debug文件夹中即可正常工作。 如果你使用Visual Studio,请将nlog.config设置为“始终复制”,它就会到达你需要的位置。

感谢您的回复@jim。我已经在应用程序X的项目'a'中将Nlog.config设置为“始终复制”,并且它会复制到应用程序X的“\bin\debug\”文件夹中。但是我正在一个全新的应用程序(Y)中使用a.dll,并希望它进入应用程序Y的“bin/debug”或进行更改,以便在“d:\dev”文件夹中查找Nlog.config。 - rookie_developer

4

您可以在NLog.config中使用包含文件。只需使用一个简单的NLog.config,其中包含来自D:\DEV的NLog.config即可。

例如:

<nlog>
    <include file="D:\DEV\NLog.Config" />
</nlog>

你也可以使用 app.config 来实现。例如:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
    </configSections>
    <nlog>
        <include file="D:\DEV\NLog.Config" />
    </nlog>
</configuration>

参见: https://github.com/nlog/nlog/wiki/Configuration-file#include-files

另请参阅: https://github.com/NLog/NLog/wiki/Environment-specific-NLog-Logging-Configuration


3
我发现:
NLog.LogManager.Configuration = new NLog.Config.XmlLoggingConfiguration(logFilePath, true);

实际上,这个指针将记录器指向要记录的文件,而不是配置文件。这件事的好处在于,您可以定义日志文件路径,而无需知道ExecutingAssembly——当使用ExcelDNA等时,这特别有用,因为XLL会动态地将程序集加载为位流。

Assembly.GetExecutingAssembly().Location

抛出异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接