2016-10-11 2 views
-1

Итак, у меня есть консольные приложения, работающие как запланированные задачи на разных клиентских серверах. Эти приложения иногда сталкиваются с сетевыми проблемами и другими дорожными блоками. В настоящее время я NORD успешно отправляет оповещения по электронной почте и регистрируется в нашем .NET API/веб-сайте.NLog: консольное приложение - прекратить отправку повторяющихся писем при повторном сбое

Вещь, иногда приложение запускается каждые 2 минуты (не спрашивайте, нет выбора), и если это приложение имеет сетевую ошибку, оно будет продолжать отправлять сообщения об ошибках каждые 2 минуты, пока проблема не возникнет решена. В то время как некоторые из них могут оценить, что это упорство, нам не нужны все эти электронные письма. Только начальный и, возможно, каждый час после этого для «подталкивания» или напоминания.

Я думал об этом и имею план, но я чувствую, что, возможно, мне не хватает какой-либо функции NLog, которую я мог бы использовать здесь.

Я знаю о Buffering Wrapper, но это похоже на постоянно работающее приложение. Наши консольные приложения запускаются и останавливаются с интервалами, поэтому это не похоже на решение.

Я мог бы написать приложение «spooler», которое будет наблюдать за таблицей/файлом NLog DB и отправляет электронные письма на основе соответствующих условий, таких как «Эта ошибка показана за последние X минут или она совершенно новая?» и решили отправить электронное письмо или нет ... но это похоже на дополнительное «движение обезьян», тогда как некоторые настройки этого буферизатора могут работать каким-то образом, я не знаю ... или какой-то другой магический плагин NLog - это ключ. ..

Идеи приветствуются. Заранее спасибо :)

ответ

1

Вещь, иногда приложение запускается каждые 2 минуты (не спрашивайте, нет выбора), и если это приложение имеет сетевую ошибку, оно будет продолжать отправлять сообщения об ошибках каждые 2 минуты, пока проблема не будет решена. В то время как некоторые из них могут оценить, что это упорство, нам не нужны все эти электронные письма. Только начальный и, возможно, каждый час после этого для «подталкивания» или напоминания.

Это действительно допустимый прецедент. Как вы уже упоминали, для вас может быть BufferingWrapper, но он ограничен, так как сообщения будут отложены. В NLog 4.4 LimitingWrapper (см. pull request) является планом, который ограничивает количество сообщений в промежутке времени.

Я знаю об Buffering Wrapper, но это похоже на постоянное приложение. Наши консольные приложения запускаются и останавливаются с интервалами, поэтому это не похоже на решение

Это также будет считаться предстоящим 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)); 
+0

I не понимаю, что вы имеете в виду.Написание моей собственной оболочки не имеет смысла, поскольку эти консольные приложения запускаются через планировщик задач каждые 2 минуты и завершают работу. Они запускаются и завершаются так, как я могу определить между прогонами, если он поймал эту ошибку ранее, используя Buffering Wrapper? (если возможно) –

+0

Ну, вам нужно хранить (и читать) где-то, что событие было поднято (например, файл, база данных). Вы можете сделать это в обертке. – Julian

+0

ОК, так что это вроде как я сказал в вопросе, та же концепция –

Смежные вопросы