ゆるふわエンジニアのブログ

行ったこと、調べたこと等をつらつらと書いていくかもしれません。

ASP.NET WebAPIで処理されなかった例外をハンドリングし、ログを出力する方法

本記事では、ASP.NET WebAPIで一切処理されなかった例外を
ハンドリング(グローバルハンドリング)し、ログを出力する方法を紹介していきます。

本記事の内容です。

例外ハンドリングクラスを作成する

今回は、GlobalExceptionLogger.csという名前でファイルを作成しています。
内容は下記の通りです。
ログ出力は、log4netを使用しています。

using System.Web.Http.ExceptionHandling;
using log4net;

namespace Hoge.Exceptions
{
    public class GlobalExceptionLogger : ExceptionLogger
    {
        private readonly ILog log = LogManager.GetLogger("Error");

        public override void Log(ExceptionLoggerContext context)
        {
            // ログ出力処理
            log.Error(context.Exception);
        }
    }

例外ハンドリングクラスをサービス登録する

上記で作成したクラスを、App_Start下のWebApiConfig.cs内でサービス登録します。
方法は下記の通りです。

using System.Web.Http;
using System.Web.Http.ExceptionHandling;
using Hoge.Exceptions;

namespace Hoge
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API の設定およびサービス

            // Web API ルート
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            // ここで例外をハンドリングするクラスをサービス設定
            config.Services.Replace(typeof(IExceptionLogger), new GlobalExceptionLogger());
        }
    }
}