アプリケーションが送信できるすべての例外を自動的にログに記録するように NLog を構成する方法はありますか? 現在、私はすべての TRY/CATCH ブロックに行き、手動で CATCH にログを追加しています。そして、将来、他の誰かがそうしたらどうなるでしょうか
常にすべての例外をログに記録するように NLog に指示する方法はありますか? 特に、キャッチされず、ポップアップを引き起こす可能性があるものはありますか?
私の知る限り、すべての例外をログに記録するためにNLogを制限する方法はありません。
未処理の例外をログに記録するだけの場合は、アプリケーションの初期化時に「UnhandledExceptionハンドラー」をAppDomainに追加できます。状況によっては、エラーをログに記録できない場合があることに注意してください(たとえば、OutOfMemory例外または何かひどい場合)。
AppDomainにはサブスクライブできるFirstChanceExceptionイベントもあることに注意してください。ただし、これは、発生する(そしてユーザーコードによって処理される可能性がある)すべての例外について通知を受け取ることを意味します。
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_CurrentDomain_UnhandledException);
static void AppDomain_CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// use logger here to log the events exception object
// before the application quits
}
これにより、アプリケーションのクラッシュを引き起こす例外のみをログに記録できることに注意してください。クラッシュを防ぐことはできません(したがって、名前:未処理の例外)。
もう1つのオプションは、アスペクト指向プログラミング(AOP)を使用することです。エラーが発生した場合は、各メソッド呼び出しの後にロギングアスペクトを導入します。アプリケーションが階層化アーキテクチャを使用している場合、これは比較的簡単に実行できます(たとえば、ビジネスロジック層のすべての呼び出しにアスペクトを追加するなど)。
PostSharpやSpring.Netのようなフレームワークが役立つ場合があります(通常、それらのWebサイトはそのための簡単な例をいくつか提供しています)。
Jacek の答えは WebApi に適しています。コンソール アプリの回答は次のとおりです。
private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_CurrentDomain_UnhandledException);
Object o = SomeMethodToThrowError(); // Cause an exception
}
static void AppDomain_CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// use logger here to log the events exception object
// before the application quits
Exception ex = (Exception)e.ExceptionObject;
Logger.Error(ex.Message + " " + ex.StackTrace);
}