2017-01-20 6 views
1

ASP.NET MVC 5アプリケーションをAzure App Serviceスロットにデプロイするときにキャプチャされない例外が記録されるのが困難です。キャッチされていない例外が発生すると、アプリケーションは正常に500を返し、標準の "エラー。リクエストの処理中にエラーが発生しました" Error.cshtmlページを返しますが、AzureのASP.NET MVC 5アプリケーションは例外をログに記録しません

現在のセットアップ:

  • Azureの設定:
    • アプリケーションロギング:オン、情報レベルで、両方のファイルシステムおよびストレージの塊にログイン
    • 詳細なエラーメッセージ:
    • オン
    • 要求トレースに失敗しました:オン
  • アプリケーションのセットアップ:両方のファイルへの書き込みや他の場所で正常に動作している宛先を、トレースにNLogを使用し
    • とのキャッチ例外
    • 明示的に私のWeb.configsに<customErrors />を設定していないが、彼らが表示されています予想されるように、ローカルおよび上でリモートオフよう
    • 所望のGlobal.asaxApplication_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設定が追加されました。

+1

FilterConfigを表示できますか?例外フィルタは最初から最後まで実行されます。:) – juunas

+2

NLogの設定はどのようになっていますか? – Julian

+0

確かに、お互いにお尋ねいただきありがとうございます。フィルターが最後まで実行されていることを認識していなかったので、確認します。 – Joshua

答えて

2

実際にこの設定を試してみましたが、問題が見つかりました。

Logger.Fatalを使用すると、何らかの理由でトレースメッセージがVerboseレベルで書き込まれます。 Error関数を使用するようにログフィルタを変更します。あなたのケースでHandleErrorAttributeが最初に実行されますので、

Logger.Error(ex, "Uncaught exception bubbled up to MVC root."); 

も、例外は、最後から最初に実行されるフィルタ。ただし、フィルタが実行されないことを意味するわけではありません(ASP.NET Coreはこの点で少し異なります)。

NLogのFatal関数は、Windows環境でユーザーにメッセージボックスを表示するために使用されるTraceクラスのFail functionを呼び出します。何らかの理由でIIS上のVerboseレベルにあります。

TL; DRFatal()を使用しないでください。Error()を使用してください。

+0

素晴らしい、感謝した@週末、それは働いた!それは致命的なことについて奇妙です - > IIS上のVerbose、バグのように聞こえます。例外フィルターの注文にも頭がおかれましたが、それはもう一つの驚きでした。 – Joshua

関連する問題