【问题标题】:Using NLog how can I make my modules log to their own unique log file使用 NLog 如何让我的模块记录到他们自己独特的日志文件
【发布时间】:2019-04-11 15:42:45
【问题描述】:

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

当我第一次开始研究这个时,对我来说最合乎逻辑的解决方案是创建一个带有自定义参数的日志配置文件,该参数用于确定文件名。

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

我觉得我遗漏了一些东西,并且真的可以使用一些帮助来弄清楚如何使这个解决方案发挥作用,或者提供任何建议来更好地了解如何实现每个模块的唯一日志文件的相同目标。

【问题讨论】:

    标签: c# logging nlog


    【解决方案1】:

    您是否尝试过使用 Logger-name ?

    <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");
    

    【讨论】:

    • 我知道您可以根据名称声明记录器,但我不知道您可以将文件名设置为短类型名称。我可能可以完成这项工作,但它会限制我想用它做的事情的范围。我真的希望我可以传递一个 ILogFactory 实例,该实例将在模块周围传递,以便模块中的每个类都可以创建自己的命名记录器,以便它们都记录到同一个文件,但可以区分原始类或类型.感谢您的建议,如果我走那条路,我会更新帖子。
    • 我没有成功使用 target="ModulesTarget"。当我使用 writeTo="ModulesTarget" 时问题解决了。除此之外,很好的解决方案。现在使用它。
    【解决方案2】:

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

    然后自定义 Logger 对象将模块名称注入LogEventInfo.Properties。可能提取自:

    System.Reflection.Assembly.GetCallingAssembly().Name
    

    那么你可以在文件名中使用${event-properties:item=ModuleName}

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

    【讨论】:

      【解决方案3】:

      您还可以为每个模块创建一个独立的LogFactory

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

      【讨论】:

      • 感谢您的输入,我想我错过了 wiki 上的那个页面。我还没有在我的主要项目中尝试过它,但它在我创建的测试项目中工作。我最初遇到的问题是,我似乎无法重用 XmlLoggingConfiguration,因为它的更改会传播到用它创建的所有 LogFactories,即使我尝试通过将其所有目标和规则复制到新的来克隆它例如,在这种情况下我怀疑的解决方案是继续从我觉得“脏”但可能仍然是最佳解决方案的文件中重新加载它。
      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多