如何通过Nlog邮件发送整个日志文件

3

你好!nLog for .NET具有将日志条目作为电子邮件发送的功能。但是,如果我们想要发送整个当前日志文件,除了将日志文件读入字符串并将其作为nLog {$message}传递之外,还有什么其他方法吗?我没有看到nLog在其mailtarget中具有附件属性。如何实现这一点呢?

2个回答

2
我今天用C#完成了这个操作。我遵循了arkmuetz在这里提供的答案 How to get path of current target file using NLog in runtime? ,首先获取了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://dev59.com/WWgu5IYBdhLWcg3wRlBh</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="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'的内容。

希望这对有所帮助。

(注意:在我的情况下,我删除了“GetLogFileName”方法中检查文件是否存在的步骤,因为文件不存在。)


这是一篇很棒的帖子。你如何处理异常?你会发送单独的电子邮件通知吗? - CaptainBli

0

我认为你可以使用一些目标的组合:默认目标 + 方法调用,然后手动发送电子邮件或使用邮件 + 缓冲来批量发送记录。


"methodcall",嗯?这看起来像是记录到函数的一种方式?但我真正想做的是将整个日志文件作为电子邮件附件发送。 - bgmCoder
这似乎是一个不错的答案 - 然而我仍然希望能有更多的细节!你以前做过这个吗? - bgmCoder
我最后做的是手动发送电子邮件并手动附加日志。如果我找出如何使用方法调用来实现它,我会发布答案。感谢您的想法;我已标记了您! - bgmCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接