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

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


person bgmCoder    schedule 04.12.2011    source источник


Ответы (2)


Я думаю, вы можете использовать комбинацию целей: цель по умолчанию + MethodCall, а затем отправить электронное письмо вручную или использовать Почта + Буферизация для отправки пакета записей.

person kolbasov    schedule 05.12.2011
comment
methodcall, а? Это похоже на способ входа в функцию? Что я действительно ХОЧУ сделать, так это отправить весь файл журнала в виде вложения электронной почты. - person bgmCoder; 05.12.2011
comment
Это кажется хорошим ответом - однако я все еще надеюсь на еще несколько подробностей! Вы когда-нибудь делали это раньше? - person bgmCoder; 06.12.2011
comment
В итоге я просто отправил электронное письмо вручную и вручную прикрепил журнал. Если я выясню, как это сделать с помощью метода вызова, я отправлю ответ. Спасибо за идею; Я тебя отметила! - person bgmCoder; 06.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, потому что в моем случае файл не существовал.)

person garddawg    schedule 27.08.2013
comment
Это отличная статья. Как вы справляетесь с исключением? Вы отправляете отдельное электронное письмо с уведомлением? - person CaptainBli; 20.12.2013