2016-10-11 4 views
-1

私は、さまざまなクライアントのサーバ上でスケジュールされたタスクとして多くのコンソールアプリケーションを実行しています。これらのアプリは、ネットワークの問題やその他の道路ブロックに時々走ります。私は現在、NLogに電子メールで警告を送信し、.NET Core API/Webサイトにログを記録しています。NLog:console app - 繰り返しの失敗で繰り返し電子メールを送信しないようにする

場合によっては、アプリが2分ごとに実行されるようにスケジュールされています(選択しないでください)。そのアプリでネットワークエラーが発生している場合は、問題が解決するまで2分ごとにエラーメールを送信し続けます。解決されました。一部の人はそれが強靭だと分かるかもしれませんが、私たちはそれらの電子メールをすべて必要としません。ちょうど最初の1つ、そしてたぶん1時間後に「ナッジ(nudge)」やリマインダのために1時間です。

私はこれについて考えており、計画がありましたが、ここで活用できるNLogの機能が不足しているような気がします。

私はBuffering Wrapperについて知っていますが、それは常に動作しているアプリのようです。私たちのコンソールアプリケーションは実行され、間隔を置いて停止するので、これは解決策ではありません。

NLog DBのテーブル/ファイルを監視し、「このエラーは過去X分以内に表示されたのですか、まったく新しいですか?」などの関連条件に基づいてメールを送信する「スプーラ」アプリを作成できました。電子メールを送信するかどうかを決めるのですが、それは特別な '猿の動き'のようですが、Buffering Wrapperのいくつかの調整は、私が気づいていない何らかの方法で動作するかもしれません...またはいくつかの魔法のNLogプラグインが鍵です。 ..

アイデア歓迎。ありがとうございます。

答えて

1

場合によってはアプリが2分ごとに実行されるようにスケジュールされています(選択しないでください)。そのアプリでネットワークエラーが発生してもエラーメールを送信し続けます2分ごとに問題が解決するまで一部の人はそれが強靭だと分かるかもしれませんが、私たちはそれらの電子メールをすべて必要としません。ちょうど最初の1つ、そしてたぶん1時間後に「ナッジ(nudge)」やリマインダのために1時間です。

これは実際に有効な使用例です。あなたが言及したように、BufferingWrapperはそれに対応することができますが、メッセージが遅れるので、制限されています.Nlog 4.4では、LimitingWrapperpull request参照)は時間軸のメッセージ量を制限するplannendです。

私はBuffering Wrapperについて知っていますが、それは常に動作しているアプリのようです。私たちのコンソールアプリケーションは実行され、間隔を置いて停止するので、これは解決策ではないようです。

これは今後のLimitingWrapperにもカウントされます。いくつかの情報(たとえば、すでに送信されたメッセージ)を保存する必要があります。これは現在処理中です。プロセスをアウトオブプロセスで保存する必要がある場合は、選択肢がたくさんあります(ファイルやデータベース、登録簿などのフォーマットとフォーマット)。誰にでも働く方法があるかどうかは分かりません。

ラッパー::

幸いにも、あなたは簡単に独自のカスタム・ロジックとWrapperあなた自身を書くことができ(できるだけ早く、main()app_startなど)

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

    } 
} 

登録

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

Iあなたが意味することを理解していない。これらのコンソールアプリケーションはタスクスケジューラ経由で2分ごとに実行され、終了するので、自分のラッパーを作成することは意味をなさないと思われます。実行して終了するので、以前にBuffering Wrapperを使用してそのエラーが発生した場合、どの実行を決定するのですか? (可能であれば) –

+0

イベントが発生した場所(ファイル、データベースなど)を保存(および読み込み)する必要があります。あなたはラッパーでそれを行うことができます。 – Julian

+0

これはまあまあですが、同じコンセプトで質問したようです。 –

関連する問題