C# NLog:重新加载时登录错误的文件
我们有一个配置文件,由GUI编辑,以动态更改文件目标的日志级别 我们的文件名如下所示:filename=“${logDir}${var:subLogDir}/${var:regionName}${logName}.dlog” 所有变量都在程序的base.config文件中,当程序通过设置启动时,regionName是动态设置的 通过NLog.LogManager.configuration.Variables[“regionName”]=string.Concat(regionName,“/”)直接在配置中使用变量 我们的问题是,当我们在程序生成日志时修改日志级别时,有时日志会直接落入${var:subLogDir}中,就好像${var:regionName}没有设置一样,即使我们知道它是 似乎在某个时刻,动态变量尚未解决。我们能做些什么来防止这种情况?在重新加载时缓冲日志 NLog版本:4.7.4 .config文件C# NLog:重新加载时登录错误的文件,c#,nlog,C#,Nlog,我们有一个配置文件,由GUI编辑,以动态更改文件目标的日志级别 我们的文件名如下所示:filename=“${logDir}${var:subLogDir}/${var:regionName}${logName}.dlog” 所有变量都在程序的base.config文件中,当程序通过设置启动时,regionName是动态设置的 通过NLog.LogManager.configuration.Variables[“regionName”]=string.Concat(regionName,“/”)
<nlog keepVariablesOnReload="true">
<variable name="subLogDir" value="/Regions" />
<include file="..\Common\Logs\BaseVariables.xml" />
<include file="..\Common\Logs\BaseTargets.xml" />
<include file="..\Common\Logs\BaseRules.xml" />
</nlog>
BaseVariables.xml
<nlog>
<!-- Default variables values -->
<variable name="logLevel" value="LogLevel.Info"/>
<variable name="callstackLogLevel" value="LogLevel.Debug"/>
<variable name="keepFileOpen" value="true"/>
<variable name="autoFlush" value="true"/>
<variable name="concurrentWrites" value="false"/>
<variable name="hasAudit" value="false"/>
<variable name="archiveAboveSize" value="52428800"/>
<variable name="maxArchiveDays" value="365"/>
<variable name="archiveNumbering" value="DateAndSequence"/>
</nlog>
BaseTargets.xml
<nlog>
<targets async="true">
<target Type="File" name="LogFile" createDirs="true" keepFileOpen="${keepFileOpen}" autoFlush="${autoFlush}"
fileName="${logDir}${var:subLogDir}/${var:regionName}${logName}.dlog"
concurrentWrites="${concurrentWrites}"
cleanupFileName="false"
archiveFileName="${archiveLogDir}${var:subLogDir}/${var:regionName}${archiveLogName}.dlog"
archiveEvery="${archiveEvery}" archiveAboveSize="${archiveAboveSize}"
archiveNumbering="${archiveNumbering}" archiveDateFormat="${archiveDateFormat}" maxArchiveDays="${maxArchiveDays}">
<layout Type="CSVLayout" delimiter="Tab" >
<column name="date" layout="${longdate}" />
<column name="level" layout="${uppercase:${level}}" />
<column name="source,keywords" layout="${logger}" />
<column name="message" layout="${message}" />
</layout>
</target>
</targets>
</nlog>
谢谢您希望NLog配置变量以两种方式运行:
- 这要求您已经配置了
(默认值)KeepVariablesOnReload=false
- 如果您在问题中包含NLog.config,则会更容易。不用猜
${var:regionName}
)
- 因为您已经配置了
(默认),所以我猜您已经连接到KeepVariablesOnReload=false
-事件并手动重新分配它LogManager.configurationreload
- 如果您在问题中包含NLog config变量的动态分配逻辑,则会更容易。不用猜
LogManager.ConfigurationReloated
-事件。因此,在动态重新分配${var:regionName}
之前发生的任何日志记录都将获得空值。另见和
当前的解决方法是停止使用LogManager.configurationreloated
-event,而只对每次重新加载时需要恢复的单个NLog配置变量使用NLog全局诊断上下文(GDC)。因此它变成了${gdc:regionName}
,您可以这样分配它(启动时一次):
另请参见:我们将keepVariablesOnReload设置为true,以避免每次重新加载config.xml文件时都必须设置它。这就是为什么我对这个行为感到困惑的原因。@cakeby然后我也对你如何实际更改其他NLog配置变量感到困惑:)@cakeby很高兴我的回答可以帮助你在问题中包含更多细节。您仍然缺少正在使用的NLog版本,以及动态更新
regionName
config变量的方式/时间。@cakeby认为您的示例非常复杂,您必须为NLog项目创建一个问题,并包括一个演示该问题的示例应用程序。使用GDC解决了我们的问题。谢谢。我认为您的示例非常复杂,您必须为NLog项目创建一个问题,并包括一个演示该问题的示例应用程序。
NLog.GlobalDiagnosticsContext.Set("regionName", "Europe");