C# NLog变量值的编程更改未生效

C# NLog变量值的编程更改未生效,c#,logging,nlog,C#,Logging,Nlog,这是我的NLog.config,我在其中定义了一个变量logLevelMaxLength: 我正在使用该变量值在日志中填充级别打印。但在我的代码中,我正在更新该值,并试图让日志使用新值进行填充: MessageBox.Show(LogManager.Configuration.Variables["logLevelMaxLength"].ToString()); //Shows old value: 20 LogManager.Configuration.Variables["logLev

这是我的NLog.config,我在其中定义了一个变量
logLevelMaxLength


我正在使用该变量值在日志中填充级别打印。但在我的代码中,我正在更新该值,并试图让日志使用新值进行填充:

MessageBox.Show(LogManager.Configuration.Variables["logLevelMaxLength"].ToString()); //Shows old value: 20

LogManager.Configuration.Variables["logLevelMaxLength"] = "10";

MessageBox.Show(LogManager.Configuration.Variables["logLevelMaxLength"].ToString()); //Shows new value: 10

我能够以编程方式更改值,并通过MessageBox确认更改,但打印的日志仍然使用旧值进行打印。我甚至试着使用
LogManager.reconfigeExistingLoggers()命令,但它没有帮助。我做错了什么?

当使用
${logLevelMaxLength}
时,无法在运行时更改该值。如果需要,请使用以下语法:
${var:logLevelMaxLength}

在配置文件中直接使用NLog变量(例如
${myvar}
)而不是使用始终执行动态查找的布局呈现程序(例如
${var:myvar}
)时,性能会更好。但此布局渲染器会对运行时修改的NLog变量作出反应

填充特性 不幸的是${pad}的padding属性不可布局(它不是Layout类型),因此不能使用动态值

有多种解决方案:

  • 编辑API中的值(例如C#)
  • 编写自己的填充布局渲染器,该渲染器可用于布局:

  • 当前的解决方法是将整个布局声明为NLog Config变量,然后使用新的完整更新布局更新NLog Config变量。使用${var:mySpecialLayout}。另请参见(感谢Rolf Kristensen!)

  • NLog配置变量是特殊的。当在
    NLog.config
    中声明和使用时,它们的工作方式类似于带有搜索/替换的文本转换。但在运行时修改NLog配置变量时,不会出现相同的搜索/替换魔术(除非该属性是NLog布局)。我猜您正在等待:当前的解决方法是将整个布局声明为NLog Config变量,然后使用新的完整更新布局更新NLog Config变量。使用
    ${var:mySpecialLayout}
    。我忘了提了,我也试过了。。但是,由于此异常,程序拒绝运行:
    System.TypeInitializationException:“NetworkAssistantNamespace.program”的类型初始值设定项引发了异常。
    nlog内部日志中的内部异常:
    nlog.NLOGConfiguration异常:在文件目标[logfile]上设置属性“Layout”时出错-->NLog.NLOGConfiguration异常:在布局渲染器上设置属性“Padding”时出错:${pad}-->System。异常:${var不是Int32的有效值。-->System.FormatException:输入字符串的格式不正确。
    @Ahmad更新了我的答案,但也看到了蛇足评论