我正在尝试更改应用程序,以便当它创建模块的实例(在另一个程序集中定义的类)时,它可以向模块提供必要的信息,从而可以根据配置创建自己的记录器服务应用程序正在加载它。
当我第一次开始从事此工作时,对我来说,最合乎逻辑的解决方案是使用自定义参数创建一个日志配置文件,该文件用于确定文件名。
<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的规范中。
我觉得自己缺少了一些东西,可以真正地使用一些帮助,要么弄清楚如何使该解决方案有效,要么就如何实现相同的目标(每个模块都具有相同的目标)提出任何建议。
答案 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