Как отправить по электронной почте весь файл журнала через Nlog


Salvete! nLog для .NET имеет возможность отправлять записи журнала в виде электронной почты. Но если мы хотим отправить весь текущий файл журнала, как это можно сделать, кроме чтения файла журнала в строку и передачи его в виде nLog {$message}? Я не вижу, что у nLog есть свойство в его mailtarget для вложений. Как это можно сделать?

2 3

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', потому что в моем случае файл не существовал.)