Я пытаюсь выяснить, как программно настроить цель NLog FallbackGroup, которая имеет две подцели типа электронной почты. Основываясь на некоторых вещах, которые происходят во время запуска приложения, я хотел бы переопределить часть «to» двух подцелей цели FallbackGroup.
В настоящее время в приложении есть файл NLog.config, содержащий эти цели. Но значения в нем жестко запрограммированы. Любое изменение потребует повторного развертывания приложения ... Это не то, что мы хотим ... Что нам действительно нужно, так это возможность изменить настройку "на" в двух целях в некоторой логике, вызываемой при запуске.
Вот файл 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 = "[email protected]"
from = "[email protected]"
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 = "[email protected]"
from = "[email protected]"
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>
Итак, мой вопрос ... Есть ли способ переопределить часть "to" подцелей в файле NLog.config программно, или лучше всего настроить всю цель FallbackGroup при запуске приложения? Второй и менее очевидный вопрос: я ищу несколько примеров любого решения ... Я не совсем понял код, чтобы сделать то же самое ... :-(





Это работает примерно так:
Загрузите конфигурацию из соответствующего XML-файла. Это может быть ваш app.config или отдельный XML-файл. Затем найдите цель по имени и приведите ее к соответствующему типу. Оттуда вы можете изменить его свойства по своему усмотрению.
var xmlConfig = new XmlLoggingConfiguration("nlog.config");
var target = xmlConfig.FindTargetByName("mailserver1") as MailTarget;
target.To = "...";
Вы можете сделать это с любой целью: загрузить ее по имени, а затем привести к соответствующему типу. Когда вы закончите вносить изменения, примените конфигурацию:
LogManager.Configuration = xmlConfig;
Это нужно сделать при запуске, прежде чем вы получите какие-либо регистраторы. I считать никакие регистраторы, которые вы получите до применения этих изменений, не будут затронуты.
Решение Эми сработало, или меня очень близко подобрало, у меня получилось небольшое изменение: для начала я использовал конфигурацию из LogManager вместо этого ... Я считаю, что это работает так же, или, по крайней мере, для меня. Еще раз спасибо за ответ.
var config = LogManager.Configuration; ...