ASP.NET MVC 5アプリケーションをAzure App Serviceスロットにデプロイするときにキャプチャされない例外が記録されるのが困難です。キャッチされていない例外が発生すると、アプリケーションは正常に500を返し、標準の "エラー。リクエストの処理中にエラーが発生しました" Error.cshtmlページを返しますが、AzureのASP.NET MVC 5アプリケーションは例外をログに記録しません
現在のセットアップ:
- Azureの設定:
- アプリケーションロギング:オン、情報レベルで、両方のファイルシステムおよびストレージの塊にログイン
- 詳細なエラーメッセージ: オン
- 要求トレースに失敗しました:オン
- アプリケーションのセットアップ:両方のファイルへの書き込みや他の場所で正常に動作している宛先を、トレースにNLogを使用し
- とのキャッチ例外
- 明示的に私のWeb.configsに
<customErrors />
を設定していないが、彼らが表示されています予想されるように、ローカルおよび上でリモートオフよう - 所望の
Global.asax
にApplication_Error
オーバーライドを追加しました(下記参照) - カスタム
ExceptionLoggingFilter
を追加しました(下記参照)と第1の項目 として私
FilterConfig.cs
pipeplineでそれを登録
Global.asaxの中のApplication_Errorオーバーライド:GlobalFiltersに登録
protected void Application_Error(Object sender, EventArgs e)
{
Trace.TraceError("Uncaught exception bubbled up. Details: {0}", e);
Logger log = LogManager.GetCurrentClassLogger();
Exception ex = Server.GetLastError();
log.Fatal(ex, "Uncaught exception bubbled up to MVC root.");
}
カスタマーExceptionLoggingFilter:
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
public void OnException(ExceptionContext filterContext)
{
var ex = filterContext.Exception;
var request = filterContext.HttpContext.Request;
Logger.Fatal(ex, "Uncaught exception bubbled up to MVC root.");
}
FilterConfig.cs:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new ExceptionLoggerFilter());
filters.Add(new HandleErrorAttribute());
}
NLog.config:
...
<targets async="true">
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message} ${exception:format=tostring}" />
<target xsi:type="Trace" name="trace" layout="${logger} ${message} ${exception:format=tostring}" />
<!-- another target for sending data to Slack here... -->
</targets>
...
<rules>
<logger name="*" minlevel="Debug" writeTo="f" />
<logger name="*" minlevel="Trace" writeTo="trace" />
</rules>
...
私が試したもの:
を、私は意図的にキャッチされない例外をトリガアクション(var neverResult = Convert.ToInt32("a");
)を作成し、私はそれに移動したときにページカスタムエラーページが表示されます。実装しているAzureの<customErrors mode="Off" />
は、私が期待していることを実行します。その例のアクションにナビゲートすると、完全なエラーメッセージとスタックトレースが表示されますが、NLog、トレース、ストリーミングログの監視、ナダ。
上記の説明のようにエラーを記録するための追加のハンドラとフィルタを追加しようとしましたが、まだ何もありません。リモートデバッグではコードがすべてこれらの追加ハンドラで実行されています。ローカルではすべてが正常に記録されます。
ヘルプ!
私は次の場所を見ても、ここでは少し迷っています。 Azureの設定、ASP.NETの処理方法、NLogがオフであるかどうかはわかりません。どんな方向にも大変感謝しています。
アップデート:実際のフィルタ設定とNLog設定が追加されました。
FilterConfigを表示できますか?例外フィルタは最初から最後まで実行されます。:) – juunas
NLogの設定はどのようになっていますか? – Julian
確かに、お互いにお尋ねいただきありがとうございます。フィルターが最後まで実行されていることを認識していなかったので、確認します。 – Joshua