C# 使用NLog如何使我的模块记录到它们自己的唯一日志文件

C# 使用NLog如何使我的模块记录到它们自己的唯一日志文件,c#,logging,nlog,C#,Logging,Nlog,我正在尝试更改一个应用程序,这样当它创建一个模块的实例(另一个程序集中定义的类)时,它可以向模块提供必要的信息,以便它可以根据加载它的服务应用程序的配置创建自己的记录器 当我第一次开始处理这个问题时,最符合逻辑的解决方案是创建一个日志配置文件,其中包含一个用于确定文件名的自定义参数 <variable name="module" value="Service"/> <targets> <target name="logFile" xsi:type="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的规范中


我觉得我遗漏了一些东西,我真的需要一些帮助,要么弄清楚如何使这个解决方案有效,要么提供一些建议,更好地了解如何实现每个模块都有一个唯一日志文件的相同目标。

您是否尝试过使用记录器名称

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

您还可以为每个模块创建一个隔离的
日志工厂


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

然后,自定义记录器对象将模块名称注入
LogEventInfo.Properties
。可能摘自:

System.Reflection.Assembly.GetCallingAssembly().Name
然后可以在文件名中使用
${event properties:item=ModuleName}


另请参见

我知道您可以根据名称声明记录器,但我不知道您可以将文件名设置为短类型名称。我可能可以让它工作,但它会限制我想用它做什么的范围。我真的希望我可以传递一个ILogFactory实例,该实例将在模块中传递,这样模块中的每个类都可以创建自己的命名记录器,这样它们都可以记录到同一个文件中,但可以区分原始类或类型。谢谢你的建议,如果我这样做的话,我会更新帖子的。我使用target=“moduleTarget”时没有成功。使用writeTo=“ModuleTarget”时解决的问题。除此之外,这是一个不错的解决方案。现在就使用它。谢谢你的输入,我想我错过了维基上的那个页面。我还没有在我的主要项目中尝试过它,但它在我创建的一个测试项目中起了作用。我最初使用它时遇到的问题是,我似乎无法重用XmlLoggingConfiguration,因为对它的更改会在使用它创建的所有日志工厂中传播,即使我试图通过将其所有目标和规则复制到新实例来克隆它,所以我怀疑在这种情况下的解决方案是继续从感觉不舒服的文件中重新加载它“肮脏”对我来说可能仍然是最好的解决办法。
System.Reflection.Assembly.GetCallingAssembly().Name