2013-06-10 2 views
1

Я следующий NLog конфигурации раздела в моем web.config (модифицирована, чтобы показывать только необходимую информацию)Настройка NLog программно web.config

<nlog> 
    <targets async="true"> 
     <target name="mail" type="Mail" 
       body="${date:format=yyyy-MM-dd HH\:mm\:ss} - ${level} [${logger}] - ${message} ${newline}${newline}${event-context:item=OtherInfo}${newline}${newline}${exception:maxInnerExceptionLevel=2:format=ToString}${newline}${newline}" 
       subject="[${machinename}] ${logger}" 
       to="[email protected]" encoding="UTF-8" from="[email protected]" smtpServer="" enableSsl="true" smtpAuthentication="Basic" 
     /> 
    </targets> 
    <targets> 
     <target name="mailsync" type="Mail" body="${date:format=yyyy-MM-dd HH\:mm\:ss} - ${level} [${logger}] - ${message} ${newline}${newline}${event-context:item=OtherInfo}${newline}${newline}${exception:maxInnerExceptionLevel=2:format=ToString}${newline}${newline}" subject="[${machinename}] ${logger}" 
       to="[email protected]" encoding="UTF-8" from="[email protected]" smtpServer="" enableSsl="true" smtpAuthentication="Basic" 
     /> 
    </targets> 
    <rules> 
     <logger name="*" level="Error" writeTo="mail" /> 
    </rules> 
</nlog> 

Я обновляет конфигурацию с помощью кода в Application_Start,

var config = LogManager.Configuration; 
const string targetName = "mail"; 

var wrapper = (AsyncTargetWrapper) config.FindTargetByName(targetName); 
wrapper.WrappedTarget.SmtpServer = "hostname"; 
wrapper.WrappedTarget.SmtpUserName = "username"; 
wrapper.WrappedTarget.SmtpPassword = "password"; 

config.RemoveTarget(targetName); 
config.AddTarget(targetName, wrapper); 

LogManager.Configuration = config; 

Однако при регистрации каких-либо ошибок электронные письма не отправляются. У меня есть дополнительный целевой файл (не показан в фрагменте кода), содержащий сообщение об ошибке. Это говорит мне, что ошибки регистрируются, но почему-то не отправляются по электронной почте.

Если вместо обновления конфигурации через код, если я жестко закодирую значения в файле web.config, то письма отправляются. Я проверил, что значения smtp, которые я использую через код, действительны.

Я просмотрел много похожих вопросов на SO, но я еще не нашел тот, который упоминает решение, которое работает для меня.

EDIT:

На основании ответа Xharze, я позволил исключение, внутреннее протоколирование и я также вывожусь значением цели после того, как я сделал мои изменения. Внутренний журнал показал исключение из MailAdrress, являющегося неправильным форматом. Поэтому я проверил все целевые значения, которые принимают адрес электронной почты, и я нашел проблему. Свойство from целевого объекта принимает адрес электронной почты, тогда как я предоставлял ему отображаемое имя!

+1

Не могли бы вы попытаться включить исключения исключения и межобщинный журнал и опубликовать его? Он может предоставить дополнительную информацию. См. Https://github.com/NLog/NLog/wiki/Logging-troubleshooting – Xharze

+0

@Xharze, спасибо помощнику. Сочетание включения исключения, внутреннего ведения журнала и вывода значений цели помогло выявить проблему. В моем производственном коде я устанавливал свойство «From'» объекта для отображения имени вместо фактического из идентификатора электронной почты. В любом случае, если вы можете опубликовать ответ, содержащий содержание вашего комментария, я отмечу это как принятый ответ. –

ответ

2

Не могли бы вы попытаться включить исключения броска и межобщинный журнал и опубликовать его? Он может предоставить дополнительную информацию. См. Github.com/NLog/NLog/wiki/Logging-troubleshooting.