NLog 无法读取 .NET Core 2.2 控制台应用程序中的 app.config configSection

Posted

技术标签:

【中文标题】NLog 无法读取 .NET Core 2.2 控制台应用程序中的 app.config configSection【英文标题】:NLog can't read app.config configSection in .NET Core 2.2 console app 【发布时间】:2020-02-09 03:42:01 【问题描述】:

我正在对 NLog 未从 .NET Core 2.2 控制台应用程序中的 App.config 加载其配置的问题进行故障排除。

当调用NLog.LogManager.GetCurrentClassLogger() 时,结果对象为空白且没有日志记录目标或其他配置。

<appSettings>配置项可以使用通常的方法毫无问题地查找:ConfigurationManager.AppSettings["settingKey"]

在试图解决这个问题的过程中,我打电话给ConfigurationManager.GetSection("nlog"),看看我是否可以手动获取设置。这引发了以下异常:

System.Configuration.ConfigurationErrorsException: 
'An error occurred creating the configuration section handler for nlog: 
Could not load type 'NLog.Config.ConfigSectionHandler' from assembly 'NLog'

我的示例应用中的整个 app.config 如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
  </configSections>
  <appSettings>
    <add key="value1" value="TEST1"/>
    <add key="value2" value="TEST2"/>
  </appSettings>
  <nlog>
    <targets>
      <target name="logfile" type="File" fileName="$basedir/logs/$shortdate.log" layout="$longdate $uppercase:$level $message" />
      <target name="logconsole" type="Console" />
    </targets>
    <rules>      
      <logger name="*" minlevel="Info" writeTo="logconsole"/>
      <logger name="*" minlevel="Info" writeTo="logfile"/>
    </rules>
  </nlog>
</configuration>

NLog 是 nuget 的 4.6.7 版。

【问题讨论】:

认为您正试图坐在两把椅子之间。 NetCore 有 appsettings.json。 NetFramework 有 app.config。你必须做出选择。如果您的应用程序是 NetCore,则使用 appsettings.json 和 $configsetting。另见github.com/NLog/NLog/wiki/ConfigSetting-Layout-Renderer 说你必须在 .net 内核中使用 appsettings.json 是不正确的:***.com/a/47636600/10660197 使用 SlowCheetah 和 App.config 时,为不同环境转换配置要简单得多。 很高兴您找到了答案。 NLog 不依赖于 nuget 包 System.Configuration.ConfigurationManager 并且无法读取 NetCore 中的 app.config。但是您可以创建自己的自定义布局渲染器并实现它,因为阅读 AppSettings 很容易。另请参阅github.com/NLog/NLog/wiki/How-to-write-a-custom-layout-renderer 替代方案,您可以将所需的 AppSettings 显式复制到 NLog GDC 中。另见github.com/NLog/NLog/wiki/Gdc-layout-renderer 【参考方案1】:

万一其他人遇到这种情况:

由于 NLog 不支持 .NET Core 中的 app.config,我的解决方案是创建一个单独的 nlog.config(使用 SlowCheetah 环境转换)并在应用程序的开头运行 NLog.LogManager.LoadConfiguration(".\\nlog.config");

除非有人通过巧妙的解决方法将所有内容保存在一个配置中,否则我会将其设置为答案。

【讨论】:

【参考方案2】:

可能有多种原因。我面临的一个原因是允许在指定文件夹上创建文件。如果由于以下代码,将记录到 bin 文件夹内的 Test_log.txt 中的任何内部错误。还要确保目标文件夹可以访问以创建文件。

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true" internalLogLevel="Warn"
      internalLogFile="Test_log.txt">

  <extensions>
    <add assembly="Microsoft.ApplicationInsights.NLogTarget" />
  </extensions>

  <!-- the targets to write to -->
  <targets>
    <!-- write logs to file -->

    <target xsi:type="File" name="ownFile" fileName="C:\Logs\log_$shortdate.log"
                 layout="$longdate|$logger|$uppercase:$level|  $message $exception" />

                 <target xsi:type="Null" name="blackhole" />

  </targets>

  <rules>
    <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
    <logger name="*" minlevel="Info" writeTo="ownFile" />
  </rules>
</nlog>

【讨论】:

以上是关于NLog 无法读取 .NET Core 2.2 控制台应用程序中的 app.config configSection的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core根据环境切换NLog配置

.NET Core使用Nlog记录日志

如何在 ASP.NET Core 中使用 NLog 的高级特性

ASP.NET Core使用NLog记录日志

Net Core 2.1 日志记录框架NLog+Mysql配置

.NET Core平台日志记录框架:NLog+Mysql