繁体   English   中英

NLog邮件目标无法与BufferingWrapper \\ PostFilteringWrapper一起使用

[英]NLog Mail Target not working with BufferingWrapper\PostFilteringWrapper

如果要通过电子邮件发送失败,我想发送日志。 但是,如果我不使用BufferingWrapper和PostFilteringWrapper(目标:mailLog3)而直接使用邮件目标,那么这也行得通,那么我为每个日志条目都获得了一封单独的电子邮件。 如果我使用BufferingWrapper和PostFilteringWrapper(目标:mailLog1),有时这是第一次工作,但不是第二次。

<configuration>
  <configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
</configSections>

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    throwExceptions="true" internalLogToConsole="true" internalLogLevel="Warn" internalLogFile="nlog.log">

<variable name="Error" value="Logs\${shortdate}_ErrorLog.xml"/>

<targets async="true">
  <!--The following will keep the default number of log messages in a buffer and write out certain levels if there is an error and other levels if there is not. Messages that appeared before the error (in code) will be included, since they are buffered.-->
  <wrapper-target xsi:type="BufferingWrapper" name="smartLog">
    <wrapper-target xsi:type="PostFilteringWrapper">
      <!--<target-ref name="fileAsCsv"/>-->
      <target xsi:type="File" fileName="${Error}"
      archiveAboveSize="4194304" concurrentWrites="false" maxArchiveFiles="1" archiveNumbering="Sequence">
        <layout xsi:type="Log4JXmlEventLayout">
        </layout>
      </target>

      <!--during normal execution only log certain messages-->
      <defaultFilter>level >= LogLevel.Warn</defaultFilter>

      <!--if there is at least one error, log everything from trace level-->
      <when exists="level >= LogLevel.Error" filter="level >= LogLevel.Trace" />
    </wrapper-target>
  </wrapper-target>

  <wrapper-target xsi:type="BufferingWrapper" name="mailLog1" slidingTimeout="true" bufferSize="1000" flushTimeout="-1">
    <wrapper-target xsi:type="PostFilteringWrapper" name="mailLog2" defaultFilter="level = LogLevel.Fatal">
      <target xsi:type="Mail" name="mailLog3"
                smtpServer="xxx"
                smtpPort="25"
                smtpAuthentication="None"
              subject="Error"
                from="xxx"
                to="xx"
                layout="${longdate} ${uppercase:${level}} ${callsite:className=true:includeSourcePath=true:methodName=true} ${message}${newline}" />
      <when exists="level = LogLevel.Fatal" filter="level >= LogLevel.Trace"/>
    </wrapper-target>
  </wrapper-target>


</targets>
<rules>
  <logger name="*" minlevel="Trace" writeTo="smartLog"/>
  <logger name="*" minlevel="Trace" writeTo="mailLog1"/>
</rules>
</nlog>
</configuration>

感谢帮助。

如果在slidingTimeout设置为true (在这种情况下,默认设置为true ),则消息已被异步写入。

因此,无需将BufferingWrapper与async属性或AsyncWrapper结合使用。 您已经注意到,将BufferingWrapper与异步写入结合使用可能会导致丢失消息。 这是因为在异步写入中,消息被写入到另一个异步写入器中。

请参阅BufferingWrapper的文档

我发现了问题。 如果我设置:

<targets async="false">

它工作正常。有趣的是在其他项目中,这也适用于:

<targets async="true">

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM