首页 > 解决方案 > NLog MailTarget with bufferingwrapper and autoflushwrapper: reverse order of events?

问题描述

I'm using the following structure:

    <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>

This works almost fine to achieve my goal: receiving an e-mail on error, with the most recent log-entries embedded to have some context about the error.

It would be nice if I get the error on the top of my e-mail-message (or, even better, receive the log-entries in descending order). How can this be done (if possible without writing my own custom target)?

标签: nlog

解决方案


你需要这样的东西:

[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>

推荐阅读