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

CJM*_*CJM 3 .net configuration logging nlog

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

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

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

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

但是,在以下行

fileTarget.Layout = "${myLayout}"
Run Code Online (Sandbox Code Playgroud)

...我得到一个ArgumentException:

LayoutRenderer cannot be found: 'myLayout'
Run Code Online (Sandbox Code Playgroud)

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

<variable name="myLayout" value="${message}" />
Run Code Online (Sandbox Code Playgroud)

是不是您不能使用变量来通过API指定布局?如果是这样的话,我会感到惊讶.或者我在哪里出错了?

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

Mar*_*rkR 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);
Run Code Online (Sandbox Code Playgroud)