NLog配置API:使用存储在变量中的布局

时间:2012-03-09 14:25:29

标签: .net logging configuration nlog

我的应用程序为应用程序本身创建了一个日志,因此记录它何时被激活,以及在应用程序级别发生了什么。

应用程序以“配置文件”为中心 - 用户加载一个配置文件,告诉应用程序在何处/何时/什么/如何。所以我还想为每个配置文件创建一个日志,以便在每次运行配置文件时记录进度。

到目前为止没有问题......除了我希望配置文件日志与配置文件本身一起存储,这意味着我需要动态配置NLog,所以我可以在运行时告诉它fileTarget路径。

但是,我还想将我想要使用的标准布局存储为NLog.config中的变量;这似乎是我所读过的常用方法。

然而,在以下一行

fileTarget.Layout = "${myLayout}"

...我收到了一个ArgumentException:

LayoutRenderer cannot be found: 'myLayout'

目前,我的布局变量很简单:

<variable name="myLayout" value="${message}" />

是否不能使用变量通过API指定布局?如果是这样的话,我会感到惊讶。或者我某处出错了?

解决方案很简单 - 我可以使用手动指定的布局填充fileTarget.Layout,但是,我很想知道计划A是否可行。

2 个答案:

答案 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)是您需要公开的内容。

祝你好运。