C# NLog变量值的编程更改未生效
这是我的NLog.config,我在其中定义了一个变量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
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更新了我的答案,但也看到了蛇足评论