Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NLog:重新加载时登录错误的文件_C#_Nlog - Fatal编程技术网

C# NLog:重新加载时登录错误的文件

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,“/”)

我们有一个配置文件,由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文件

<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配置变量以两种方式运行:

  • 编辑NLog.config文件时,应丢弃现有的NLog config变量,并在重新加载更新的NLog.config时使用这些变量

    • 这要求您已经配置了
      KeepVariablesOnReload=false
      (默认值)

      • 如果您在问题中包含NLog.config,则会更容易。不用猜
  • 重新加载NLog.config之后,您希望保留一个NLog config变量(
    ${var:regionName}

    • 因为您已经配置了
      KeepVariablesOnReload=false
      (默认),所以我猜您已经连接到
      LogManager.configurationreload
      -事件并手动重新分配它

      • 如果您在问题中包含NLog config变量的动态分配逻辑,则会更容易。不用猜
  • 分配并初始化重新加载的NLog配置后,将调用
    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");