有没有可能是NLog在出错的时候发邮件,包含前面5个不同级别的日志?
Is it possible that NLog send email when error occurs and includes the previous five logs with different levels?
看了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
如何在报错时包含前5条不同级别的日志?
这是你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>
好的起点是激活 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"
来实现。
应仅在发生错误日志事件时写入信息日志事件。
- 这可以通过使用 AutoFlushWrapper 来实现,因此它会在 Error-LogEvent 时触发缓冲的 LogEvents 的刷新
- 在 BufferingWrapper
上结合使用 overflowAction="Discard"
示例:
<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.com/nlog/NLog/wiki/BufferingWrapper-target#send-batch-when-triggered-by-event
看了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
如何在报错时包含前5条不同级别的日志?
这是你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>
好的起点是激活 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"
来实现。
- 这可以通过将日志记录规则从
应仅在发生错误日志事件时写入信息日志事件。
- 这可以通过使用 AutoFlushWrapper 来实现,因此它会在 Error-LogEvent 时触发缓冲的 LogEvents 的刷新
- 在 BufferingWrapper 上结合使用
overflowAction="Discard"
示例:
<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.com/nlog/NLog/wiki/BufferingWrapper-target#send-batch-when-triggered-by-event