Сальвете! nLog для .NET имеет возможность отправлять записи журнала по электронной почте. Но если мы хотим отправить весь текущий файл журнала, как это можно сделать, кроме чтения файла журнала в строку и передачи ее как nLog {$message}
? Я не вижу, чтобы nLog имел свойство в mailtarget
для вложений. Как это может быть сделано?
Как отправить весь файл журнала по электронной почте через Nlog
Ответы (2)
Я думаю, вы можете использовать комбинацию целей: цель по умолчанию + MethodCall, а затем отправить электронное письмо вручную или использовать Почта + Буферизация для отправки пакета записей.
methodcall
, а? Это похоже на способ входа в функцию? Что я действительно ХОЧУ сделать, так это отправить весь файл журнала в виде вложения электронной почты.
- person bgmCoder; 05.12.2011
Я только что сделал это сегодня на 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);
Вот моя мысль о файле 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" >
<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="[email protected]"
to="[email protected]"/>
</targets>
<rules>
<logger name="MultipleFileBuilder" minlevel="Trace" writeTo="DailyFile" />
<logger name="ExcelBuilderService" minlevel="Debug" writeto="MyMailer" />
</rules>
</nlog>
Мое приложение сначала регистрируется в регистраторе с именем MultipleFileBuilder. Затем я использую класс NLogHelper для получения содержимого Target 'DailiyFile'.
Надеюсь, это кому-то поможет.
(ПРИМЕЧАНИЕ: я удалил проверку, чтобы увидеть, существует ли файл в методе GetLogFileName, потому что в моем случае файл не существовал.)