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 的高级特性