【问题标题】:How to programmatically configure nLog targets如何以编程方式配置 nLog 目标
【发布时间】:2018-03-22 15:09:20
【问题描述】:

我试图弄清楚如何以编程方式配置具有两个电子邮件类型子目标的 NLog FallbackGroup 目标。基于应用程序启动期间发生的一些事情,我想覆盖FallbackGroup 目标的两个子目标的“to”部分。

目前,该应用有一个 NLog.config 文件,其中包含这些目标。但是,这些值是硬编码的。任何更改都需要重新部署应用程序......这不是我们想要的......我们真正需要的是能够在启动时调用的一些逻辑中修改两个目标中的“to”设置。

这是 NLog.config 文件:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
    autoReload="true"
    throwExceptions="false"
    internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<targets>
    <target name="logfile" xsi:type="File" fileName="BAM_logfile.txt" />
    <target xsi:type="FallbackGroup"
        name="email-error"
        returnToFirstOnSuccess="true">      
        <target xsi:type="Mail"
            name="mailserver1"
            to="kevin.orcutt@acme.com"
            from="noreply@acme.com"
            subject="Exception Message from: ${processname} v:${assembly-version} on ${machinename}"
            smtpServer="smtp.acme.com"
            smtpPort="25"
            layout="${longdate}${newline}${windows-identity} running ${processname} v:${assembly-version} on ${machinename}${newline}At: ${callsite}${newline}Message: ${message}${newline}Exception:${newline}${exception:format=toString,Data:maxInnerExceptionLevel=10}${newline}" />
        <target xsi:type="Mail"
            name="mailserver2"
            to="kevin.orcutt@acme.com"
            from="noreply@acme.com"
            subject="Exception Message from: ${processname} v:${assembly-version} on ${machinename}"
            smtpServer="mail.acme.com"
            smtpPort="25"
            layout="${longdate}${newline}${windows-identity} running ${processname} v:${assembly-version} on ${machinename}${newline}At: ${callsite}${newline}Message: ${message}${newline}Exception:${newline}${exception:format=toString,Data:maxInnerExceptionLevel=10}${newline}" />
    </target>
</targets>
<rules>
    <logger name="*" minlevel="Info" maxlevel="Warn" writeTo="logfile" />
    <logger name="*" level="Error" writeTo="email-error" />
</rules>
<extensions>
    <add assembly="NLog.MailKit"/>
</extensions>
</nlog>

所以我的问题是......有没有办法以编程方式覆盖 NLog.config 文件中子目标的“to”部分,或者最好在应用程序启动时配置整个 FallbackGroup 目标?第二个不太明显的问题是我正在寻找这两种解决方案的一些示例......我还没有完全弄清楚要执行的代码...... :-(

【问题讨论】:

    标签: c# nlog


    【解决方案1】:

    它的工作原理是这样的:

    从相应的 XML 文件加载配置。这可以是您的 app.config 或单独的 XML 文件。然后按名称找到目标,并将其转换为适当的类型。从那里你可以修改它的属性,但你认为合适。

    var xmlConfig = new XmlLoggingConfiguration("nlog.config");
    var target = xmlConfig.FindTargetByName("mailserver1") as MailTarget;
    target.To = "...";
    

    您可以对任何目标执行此操作:按名称加载它,然后将其转换为适当的类型。完成更改后,应用配置:

    LogManager.Configuration = xmlConfig;
    

    这应该在启动时完成,在您获得任何记录器之前。我认为您在应用这些更改之前获得的任何记录器都不会受到影响。

    【讨论】:

    • 艾米的解决方案有效,或者让我非常接近,对我来说有一个细微的变化:首先我使用了 LogManager 中的配置......我相信它的工作原理是一样的,或者至少它对我有用。再次感谢您的回答。 var config = LogManager.Configuration; ...
    猜你喜欢
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多