使用NuGet包形式的NLog辅助库时,NLog.config应放置在何处?
NLog.config文件的正确放置位置咨询
我使用Visual Studio 2022、.NET 6.0及C#开发。同事创建了一个用于NLog的NuGet辅助库,负责创建logger对象并调用Log方法,但我不确定NLog.config文件该放在哪里,特此咨询该场景下的正确位置。
测试应用引用设置

测试应用调用代码
// Test App logger.Log(LogLevel.Debug, message, args);
已尝试的NLog.config放置位置
- C:\Test\
- C:\Test\Debug
- C:\Test\Debug\net6.0
NLog.config配置内容
<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" autoReload="true" throwExceptions="false" internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log"> <!-- optional, add some variables --> <variable name="myvar" value="myvalue"/> <!-- 自定义日志规则和输出的配置说明 --> <targets> <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> </targets> <rules> <!-- 输出所有Debug及以上级别日志到目标"f" --> <logger name="*" minlevel="Debug" writeTo="f" /> </rules> </nlog>
尝试添加到appsettings.json的配置
{ "ConnectionStrings": { "TheSQLConnectionString": "" }, "NLog": { "targets": { "console": { "type": "File", "name": "f", "fileName": "nlogtest.log" } }, "rules": [ { "logger": "*", "minLevel": "Trace", "writeTo": "f" } ] } }
NuGet库代码结构
// NuGet Library public class NLogHelper : Microsoft.Extensions.Logging.ILogger { ... public void Log<TState>( LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { if (!IsEnabled(logLevel)) { return; } var nlog = LogManager.GetCurrentClassLogger(); switch (logLevel) { case LogLevel.Trace: nlog.Log(NLog.LogLevel.Trace, exception, $"{formatter(state, exception)}"); break; case LogLevel.Debug: nlog.Log(NLog.LogLevel.Debug, exception, $"{formatter(state, exception)}"); break; case LogLevel.Information: nlog.Log(NLog.LogLevel.Info, exception, $"{formatter(state, exception)}"); break; case LogLevel.Warning: nlog.Log(NLog.LogLevel.Warn, exception, $"{formatter(state, exception)}"); break; case LogLevel.Error: nlog.Log(NLog.LogLevel.Error, exception, $"{formatter(state, exception)}"); break; case LogLevel.Critical: nlog.Log(NLog.LogLevel.Fatal, exception, $"{formatter(state, exception)}"); break; } ... }
解决方案
- 核心规则:NLog默认从测试应用的输出工作目录加载配置,也就是
C:\Test\Debug\net6.0,但必须确保配置文件被正确复制到该目录。 - 正确操作流程:
- 将
NLog.config放在测试应用的项目根目录(C:\Test\)。 - 在Visual Studio中选中该文件,右键打开属性面板:
- 设置「复制到输出目录」为「如果较新则复制」或「始终复制」。
- 设置「生成操作」为「内容」。
- 编译后文件会自动同步到输出目录,NLog即可正常读取。
- 将
- appsettings.json配置说明:当前NuGet库用的是NLog原生初始化方式
LogManager.GetCurrentClassLogger(),不会自动读取appsettings.json中的NLog配置。如果要使用该方式配置,需要在测试应用启动时通过NLog.Extensions.Logging包加载配置,或修改NuGet库的初始化逻辑。 - 排查验证方法:
- 开启NLog内部日志(将
internalLogLevel改为Debug),查看c:\temp\nlog-internal.log,确认配置文件是否被检测到。 - 检查测试应用的输出目录,确认
NLog.config存在。
- 开启NLog内部日志(将
内容的提问来源于stack exchange,提问作者boilers222
相关产品推荐
相关产品推荐

