带有 bufferingwrapper 和 autoflushwrapper 的 NLog MailTarget:事件的相反顺序?

NLog MailTarget with bufferingwrapper and autoflushwrapper: reverse order of events?

我正在使用以下结构:

    <target name="MailOnError" xsi:type="AutoFlushWrapper" condition="level >= LogLevel.Error" flushOnConditionOnly="true">
      <target name="MailBuffer" xsi:type="BufferingWrapper" bufferSize="250" overflowAction="Discard">
        <-- note: mail config has been removed -->
        <target xsi:type="Mail"
              name="email"
              header="Error in ${processname}:${newline}
Machine: ${machinename}${newline}
Proces: ${processname}${newline}
User: ${environment-user}${newline}
${newline}
${newline}"
              layout="${date:format=HH\:mm\:ss}: ${message} (in ${callsite})${newline}"
              />
      </target>

这几乎可以很好地实现我的目标:收到一封出错的电子邮件,其中嵌入了最新的日志条目以提供有关错误的一些上下文。

如果我在电子邮件消息的顶部看到错误就好了(或者,更好的是,按降序接收日志条目)。 如何做到这一点(如果可能,无需编写我自己的自定义目标)?

你需要这样的东西:

[Target("ReverseOrderWrapper", IsWrapper = true)]
public class ReverseOrderWrapper : WrapperTargetBase
{
    protected override void Write(IList<AsyncLogEventInfo> logEvents)
    {
        // Some re oder logic
        var reorderEvents = logEvents.Reverse().ToArray();
        WrappedTarget.WriteAsyncLogEvents(reorderEvents);
    }
}

注册(尽快),NLog 4.7+ 语法

NLog.LogManager.Setup().SetupExtensions(s =>
   s.RegisterTarget<ReverseOrderWrapper>("ReverseOrderWrapper")
);

用法:

<target name="MailOnError" xsi:type="AutoFlushWrapper" condition="level >= LogLevel.Error" flushOnConditionOnly="true">
    <target name="MailBuffer" xsi:type="BufferingWrapper" bufferSize="250" 
overflowAction="Discard">
        <target name="Reoder" xsi:type="ReverseOrderWrapper">
            <-- note: mail config has been removed -->
            <target xsi:type="Mail"
                name="email"
                header="Error in ${processname}:${newline}
Machine: ${machinename}${newline}
Proces: ${processname}${newline}
User: ${environment-user}${newline}
${newline}
${newline}"
                layout="${date:format=HH\:mm\:ss}: ${message} (in ${callsite})${newline}"
                />
    </target>
    </target>
</target>