NLog是否可以在发生错误的时候发送邮件,并且包括前面五个不同级别的日志?

问题描述 投票:0回答:1

我看了BufferingWrapper的文档,不知道怎么做......

我做了一个简单的例子。

假设我在错误发生之前记录了一些我需要的信息。

logger.LogInformation("a");
logger.LogInformation("b");
logger.LogInformation("c");
logger.LogError(new Exception("My Custom Exception"), "Test Mail1");
logger.LogInformation("1");
logger.LogWarning("2");
logger.LogWarning("3");
logger.LogInformation("4");
logger.LogInformation("5");
logger.LogError(new Exception("My Custom Exception"), "Test Mail2");

我希望能收到两封这样的邮件

2020-05-14 XX: XX: XX.XXXX [1] INFO ConsoleApp1.Runner a
2020-05-14 XX: XX: XX.XXXX [1] INFO ConsoleApp1.Runner b
2020-05-14 XX: XX: XX.XXXX [1] INFO ConsoleApp1.Runner c
2020-05-14 XX: XX: XX.XXXX [1] ERROR ConsoleApp1.Runner Test Mail1 System.Exception: My Custom Exception
2020-05-14 XX: XX: XX.XXXX [1] INFO ConsoleApp1.Runner 1
2020-05-14 XX: XX: XX.XXXX [1] WARN ConsoleApp1.Runner 2
2020-05-14 XX: XX: XX.XXXX [1] WARN ConsoleApp1.Runner 3
2020-05-14 XX: XX: XX.XXXX [1] INFO ConsoleApp1.Runner 4
2020-05-14 XX: XX: XX.XXXX [1] INFO ConsoleApp1.Runner 5
2020-05-14 XX: XX: XX.XXXX [1] ERROR ConsoleApp1.Runner Test Mail2 System.Exception: My Custom Exception

但我只能收到两封邮件的错误信息。

2020-05-14 XX: XX: XX.XXXX [1] ERROR ConsoleApp1.Runner Test Mail1 System.Exception: My Custom Exception
2020-05-14 XX: XX: XX.XXXX [1] ERROR ConsoleApp1.Runner Test Mail2 System.Exception: My Custom Exception

如何才能在错误发生时,将前面五个不同级别的日志包含进来?

这是我的nlog.config

<?xml version="1.0" encoding="utf-8" ?>
<!-- XSD manual extracted from package NLog.Schema: https://www.nuget.org/packages/NLog.Schema-->
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogFile="c:\temp\console-example-internal.log"
      internalLogLevel="Info" >

  <extensions>
    <add assembly="NLog.MailKit"/>
  </extensions>
  <targets>
    <target xsi:type="Mail"
          name="MailTarget"
          layout="${longdate:universalTime=true} [${threadid}] ${uppercase:${level}} ${logger} ${message} ${exception:format=tostring}"
          addNewLines="true"
          subject="[My Error Log - Dev] Execption"
          to=""
          from=""
          smtpServer="" />
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <logger name="*" level="Error" writeTo="MailTarget" />
  </rules>
</nlog>
c# .net-core nlog
1个回答
1
投票

好吧,一个好的起点是激活 BufferingWrapper,就像这样。

 <targets>
    <target xsi:type"BufferingWrapper" name="MailBuffer">
       <target xsi:type="Mail" name="MailTarget" />
    </target>
 </targets>
 <rules>
    <logger name="*" level="Error" writeTo="MailBuffer" />
 </rules>

但现在你只是启用了缓冲写入Error -LogEvents到MailTarget的功能,而缺少了这些功能。

  • 应该包括Info -LogEvents而不仅仅是Error -LogEvents.

    • 这可以通过改变日志规则来实现,从 level="Error"minLevel="Info".
  • 应该只在Error-LogEvent发生时才写入Info-LogEvents,这可以通过使用AutoFlushWrapper来实现,所以它在Error-LogEvent时触发缓冲的LogEvents的刷新。

    • 这可以通过使用AutoFlushWrapper来实现,所以它在Error-LogEvent发生时触发缓冲的LogEvents的刷新。
    • 结合使用 overflowAction="Discard" 上的 BufferingWrapper

例子。

<targets>
  <target xsi:type="AutoFlushWrapper" name="MailErrorFlush"
    condition="level >= LogLevel.Error"
    flushOnConditionOnly="true">
     <target xsi:type="BufferingWrapper" name="MailBuffer"
       bufferSize="50"
       overflowAction="Discard">
        <target xsi:type="Mail" name="MailTarget" />
     </target>
  </target>
</targets>
<rules>
  <logger name="*" minlevel="Info" writeTo="MailErrorFlush" />
</rules>

另见 https:/github.comnlogNLogwikiBufferingWrapper-target#send-batch-when-triggered-event。

© www.soinside.com 2019 - 2024. All rights reserved.