繁体   English   中英

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

[英]Using NLog how can I make my modules log to their own unique log file

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

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

<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的规范中。

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

您是否尝试使用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");

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

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

System.Reflection.Assembly.GetCallingAssembly().Name

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM