Как отправить по электронной почте весь файл журнала через Nlog
Salvete! nLog для .NET имеет возможность отправлять записи журнала в виде электронной почты. Но если мы хотим отправить весь текущий файл журнала, как это можно сделать, кроме чтения файла журнала в строку и передачи его в виде nLog {$message}
? Я не вижу, что у nLog есть свойство в его mailtarget
для вложений. Как это можно сделать?
2 ответа:
Я думаю, что вы можете использовать комбинацию целей: цель по умолчанию + MethodCall , а затем отправлять электронную почту вручную или использовать Mail + буферизация для отправки пакета записей.
Я только что сделал это сегодня в C#. Я следовал ответу, предоставленному arkmuetz здесь Как получить путь текущего целевого файла, используя NLog во время выполнения? чтобы сначала получить имя файла цели Nlog. Затем я прочитал файл и скопировал содержимое файла в другую цель Nlog, которая отправила журнал по электронной почте в теле сообщения.
Сначала я создал класс NlogHelper
public static class NlogHelper { /// <summary> /// Gets LogFileName by TargetName /// </summary> /// <param name="targetName">The nLog targetname for the specified logger.</param> /// <returns></returns> /// <remarks>https://stackoverflow.com/questions/11452645/how-to-get-path-of-current-target-file-using-nlog-in-runtime</remarks> public static string GetLogFileName(string targetName) { string fileName = null; if (LogManager.Configuration != null && LogManager.Configuration.ConfiguredNamedTargets.Count != 0) { Target target = LogManager.Configuration.FindTargetByName(targetName); if (target == null) { throw new Exception("Could not find target named: " + targetName); } FileTarget fileTarget = null; WrapperTargetBase wrapperTarget = target as WrapperTargetBase; // Unwrap the target if necessary. if (wrapperTarget == null) { fileTarget = target as FileTarget; } else { fileTarget = wrapperTarget.WrappedTarget as FileTarget; } if (fileTarget == null) { throw new Exception("Could not get a FileTarget from " + target.GetType()); } var logEventInfo = new LogEventInfo { TimeStamp = DateTime.Now }; fileName = fileTarget.FileName.Render(logEventInfo); } else { throw new Exception("LogManager contains no Configuration or there are no named targets"); } //if (!File.Exists(fileName)) //{ // throw new Exception("File " + fileName + " does not exist"); //} return fileName; } }
Затем я извлек имя файла в конструкторе и сохранил его для дальнейшего использования. использовать.
_logLileName = NlogHelper.GetLogFileName("DailyFile");
Для своих целей я создал свойство, которое позже использовал для извлечения содержимого файла журнала.
public string LogFileContent { get { return File.ReadAllText(_logLileName); } }
Наконец, я добавил содержимое файла в журнал для отправки по электронной почте.
_logger.Error("Excel Builder LinkShare Error encountered -- Some companies did not complete succesfully!. Please review logs. \n" + mfb.LogFileContent);
Вот мой нлог.config file thought поможет сделать вещи более понятными.
<?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" > <targets> <target name="console" xsi:type="ColoredConsole" layout="${date:format=HH\:mm\:ss}|${level}|${stacktrace}|${message}" /> <target name="file" xsi:type="File" fileName="${basedir}/DomoExcelBuilderLog.txt" layout="${stacktrace} ${message}" /> <target name="DailyFile" xsi:type="File" fileName="C:\Temp\Log${shortdate}.txt" layout="${date:format=HH\:mm\:ss} --> ${message}" deleteOldFileOnStartup="true" /> <target name="file2" xsi:type="File" fileName="${basedir}/ServiceLog.txt" layout="${stacktrace} ${message}" /> <target name="MyMailer" xsi:type="Mail" smtpServer="some.server.com" smtpPort="587" smtpAuthentication="Basic" smtpUsername="no-reply" smtpPassword="somepassword" enableSsl="true" from="no-reply@some.server.com" to="myemail@gmail.com"/> </targets> <rules> <logger name="MultipleFileBuilder" minlevel="Trace" writeTo="DailyFile" /> <logger name="ExcelBuilderService" minlevel="Debug" writeto="MyMailer" /> </rules> </nlog>
Мое приложение сначала регистрируется в логгере с именем 'MultipleFileBuilder'. Затем я использую класс NLogHelper для извлечения содержимого целевого файла "DailiyFile".
Надеюсь, это поможет someoneout.
(примечание: Я удалил проверку, чтобы увидеть, существует ли файл в методе 'GetLogFileName', потому что в моем случае файл не существовал.)