使用NLog,如何使模块记录到其自己的唯一日志文件中

时间:2019-04-11 15:42:45

标签: c# logging nlog

我正在尝试更改应用程序,以便当它创建模块的实例(在另一个程序集中定义的类)时,它可以向模块提供必要的信息,从而可以根据配置创建自己的记录器服务应用程序正在加载它。

当我第一次开始从事此工作时,对我来说,最合乎逻辑的解决方案是使用自定义参数创建一个日志配置文件,该文件用于确定文件名。

<variable name="module" value="Service"/>

<targets>
   <target name="logFile" xsi:type="File" fileName="${basedir}Logs/${var:module}.txt"
            layout="${time} ${uppercase:${level}} ${var:module} ${logger} ${message}" />
</targets>

然后,我存储LoggingConfiguration,以便每次加载模块时,都会根据配置创建一个新的LogFactory,更改自定义变量值,并将其作为对模块的依赖项注入,以用于创建自己的记录器

即使编写一个复杂的方法尝试克隆LoggingConfiguration时,我仍然遇到的问题是,它总是导致所有内容(包括服务)记录到最后创建的LogFactory的规范中。

我觉得自己缺少了一些东西,可以真正地使用一些帮助,要么弄清楚如何使该解决方案有效,要么就如何实现相同的目标(每个模块都具有相同的目标)提出任何建议。

3 个答案:

答案 0 :(得分:1)

您是否尝试使用Logger名称?

<targets>
   <target name="ModulesTarget" xsi:type="File" fileName="${basedir}Logs/${logger:shortname=true}.txt" />
</targets>
<rules>
   <logger name="Modules.*" target="ModulesTarget"/>
</rules>

然后像这样创建模块记录器:

var moduleLogger = NLog.LogManager.GetLogger("Modules.MyModuleName");

答案 1 :(得分:1)

您还可以为所有模块提供通用接口。此接口还包括获取包装NLog Logger的自定义Logger对象的功能。

然后,自定义Logger对象将模块名称注入LogEventInfo.Properties中。也许摘自:

System.Reflection.Assembly.GetCallingAssembly().Name

然后您可以在文件名中使用${event-properties:item=ModuleName}

另请参阅https://github.com/NLog/NLog/wiki/EventProperties-Layout-Renderer

答案 2 :(得分:0)

您还可以为每个模块创建一个隔离的LogFactory

https://github.com/NLog/NLog/wiki/Configure-component-logging