2019年3月9日土曜日

ASP.NET MVC:全ての例外をログに出力する

ASP.NET MVC:全ての例外をログに出力する

エラー発生時エラー情報を画面に表示していたが
エンドユーザーからPCが壊れたと勘違いするので表示を辞めた。
今まではglobal.asaxのクラスApplicarion_Error内に
エラー内容をログとして出力していたがcontoller内のエラーはApplication_Errorを

通過しないことが分かった。

方法としてfilterにhandleerrorattributeと同様にログ出力クラスを定義する。
上記クラスでログ出力を行う。

https://paulthecyclist.com/2013/05/17/log-all-mvc-errors/

上記リンク先を参照

自分はlog4net ではなくNLogを使用しました。


App_Start/FilterConfig.cs

 public class FilterConfig {
        private static ILogger logger = LogManager.GetLogger("logfile");

        public static void RegisterGlobalFilters(GlobalFilterCollection filters, ILogger logger) {
            filters.Add(new HandleErrorAttribute());
            filters.Add(new ExceptionLoggingFilter(logger));  // add
        }
    }

ExceptionLoggingFilter.cs

    public class ExceptionLoggingFilter : IExceptionFilter {

        private static ILogger _logger = LogManager.GetLogger("logfile");

        public ExceptionLoggingFilter(ILogger logger) {
            _logger = logger;
        }

        public virtual void OnException(ExceptionContext filterContext) {
            _logger.Error("contller : " + filterContext.Controller);
            _logger.Error(filterContext.Exception);
        }

        public interface IExceptionFilter {
            void OnException(ExceptionContext filterContext);
        }
    }

Global.asax.cs

 protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            ILogger logger = LogManager.GetLogger("logfile");

            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters, logger);
           
        }

0 件のコメント:

コメントを投稿