You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NuGet包形式的NLog辅助库时,NLog.config应放置在何处?

NLog.config文件的正确放置位置咨询

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

测试应用引用设置

测试应用引用NuGet库

测试应用调用代码

// 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;
        }
    ...
    }

解决方案

  1. 核心规则:NLog默认从测试应用的输出工作目录加载配置,也就是C:\Test\Debug\net6.0,但必须确保配置文件被正确复制到该目录。
  2. 正确操作流程:
    • 将NLog.config放在测试应用的项目根目录(C:\Test\)。
    • 在Visual Studio中选中该文件,右键打开属性面板:
      • 设置「复制到输出目录」为「如果较新则复制」或「始终复制」。
      • 设置「生成操作」为「内容」。
    • 编译后文件会自动同步到输出目录,NLog即可正常读取。
  3. appsettings.json配置说明:当前NuGet库用的是NLog原生初始化方式LogManager.GetCurrentClassLogger(),不会自动读取appsettings.json中的NLog配置。如果要使用该方式配置,需要在测试应用启动时通过NLog.Extensions.Logging包加载配置,或修改NuGet库的初始化逻辑。
  4. 排查验证方法:
    • 开启NLog内部日志(将internalLogLevel改为Debug),查看c:\temp\nlog-internal.log,确认配置文件是否被检测到。
    • 检查测试应用的输出目录,确认NLog.config存在。

内容的提问来源于stack exchange,提问作者boilers222

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:41:27