我的应用程序为应用程序本身创建了一个日志,因此记录它何时被激活,以及在应用程序级别发生了什么。
应用程序以“配置文件”为中心 - 用户加载一个配置文件,告诉应用程序在何处/何时/什么/如何。所以我还想为每个配置文件创建一个日志,以便在每次运行配置文件时记录进度。
到目前为止没有问题......除了我希望配置文件日志与配置文件本身一起存储,这意味着我需要动态配置NLog,所以我可以在运行时告诉它fileTarget路径。
但是,我还想将我想要使用的标准布局存储为NLog.config中的变量;这似乎是我所读过的常用方法。
然而,在以下一行
fileTarget.Layout = "${myLayout}"
...我收到了一个ArgumentException:
LayoutRenderer cannot be found: 'myLayout'
目前,我的布局变量很简单:
<variable name="myLayout" value="${message}" />
是否不能使用变量通过API指定布局?如果是这样的话,我会感到惊讶。或者我某处出错了?
解决方案很简单 - 我可以使用手动指定的布局填充fileTarget.Layout
,但是,我很想知道计划A是否可行。
答案 0 :(得分:6)
我获得了最新的源代码(NLog 3.2.0.0),并找到了一个支持的解决方案,无需对NLog进行任何更改。下面的代码获取变量的值。我认为它也可以写入,但我没有尝试,因为我不需要该功能。这回答了这个问题。最后一行评估变量中的文本,以呈现它包含的任何布局渲染器。
var config = (NLog.Config.XmlLoggingConfiguration)LogManager.Configuration;
string dir = config.Variables["logDirectory"];
dir = NLog.Layouts.SimpleLayout.Evaluate(dir);
答案 1 :(得分:2)
如果你使用的是NLog网站的编译二进制文件,那是不可能的,主要是因为NLog没有公开用于访问<variable>
元素的API。
您可以建议作者添加此功能,或者如果您真的热衷于拥有此功能,则下载并修改源代码。 <{1}}文件中的private string ExpandVariables(string input)
是您需要公开的内容。