NLog:控制台应用 - 停止发送重复电子邮件重复失败

时间:2016-10-11 13:37:41

标签: asp.net console-application nlog

所以,我有很多控制台应用程序在各个客户端的服务器上按计划运行。这些应用程序偶尔会遇到网络问题和其他障碍。我目前有NLog很高兴通过电子邮件发送警报并登录到我们的.NET Core API /网站。

事情是,有时一个应用程序计划每2分钟运行一次(不要问,没有选择),如果该应用程序出现网络错误,它将继续每2分钟发送一次错误电子邮件,直到问题得到解决。虽然有些人可能会欣赏它的坚韧,但我们并不需要所有这些电子邮件。只是最初的一个,也许是每个小时之后的一个'轻推'或提醒。

我已经考虑了这个并制定了计划,但我觉得我可能会错过NLog的一些功能,我可以在这里使用。

我知道Buffering Wrapper,但这似乎是一个不断运行的应用程序。我们的控制台应用程序会定期运行和停止,因此这似乎不是解决方案。

我可以编写一个“假脱机程序”应用程序,它可以监视NLog数据库表格/文件,并根据相关条件发送电子邮件,例如“过去X分钟内是否显示此错误,还是全新的?”决定是否发送电子邮件......但这似乎是额外的'猴子运动',而缓冲包装的一些调整可能以某种方式工作,我不知道...或其他一些神奇的NLog插件是关键。 ..

欢迎提示。在此先感谢:)

1 个答案:

答案 0 :(得分:2)

  

事情是,有时一个应用程序计划每2分钟运行一次(不要问,没有选择),如果该应用程序出现网络错误,它将继续每2分钟发送一次错误电子邮件,直到问题得到解决。虽然有些人可能会欣赏它的坚韧,但我们并不需要所有这些电子邮件。只是最初的一个,也许是每个小时之后的一个'轻推'或提醒。

这确实是一个有效的用例。正如你所提到的,你可以使用BufferingWrapper,但是它有限,因为消息会被延迟..在NLog 4.4中,LimitingWrapper(见pull request)是plannend,它限制了消息的数量。一段时间。

  

我知道缓冲包装,但这似乎是一个不断运行的应用程序。我们的控制台应用程序会间隔运行和停止,因此这似乎不是解决方案

这也将计入即将到来的LimitingWrapper。我们需要存储一些信息(例如已发送的消息),现在正在进行中。如果您需要将其保存在进程外,将会有很多选择(在哪里以及哪种格式 - 例如文件,数据库,寄存器)。我不确定是否有办法让每个人都能工作。

幸运的是,您可以使用自己的自定义逻辑轻松编写自己的Wrapper

打包机:

[Target("MyWrapper", IsWrapper = true)]
public class MyTargetWrapper : WrapperTargetBase
{
     /// <summary>
    /// Option that could be set from XML config.
    /// </summary>
    public int MinutesCount { get; set; }

    protected override void Write(AsyncLogEventInfo logEvent)
    {

        if (ShouldLog(logEvent)) 
        {
            this.WrappedTarget.WriteAsyncLogEvent(logEvent);

        }

    }

    private bool ShouldLog(logEvent)
    {
       // ----- todo ------
       // e.g. write to file/database when the last error was and check it here.

    }
}

注册(尽快main()app_start等)

ConfigurationItemFactory.Default.Targets
                        .RegisterDefinition("NameInConfig", typeof(MyNamespace.MyTargetWrapper));