ASP.NET MVCのエラーログ出力をELMAHで行う

June 27, 2023

はじめに

自社サービスは ASP.NET MVC を用いて開発をしているが、規模が大きくなりつつあり、エラーログ出力をしていなかったのですることとなった。 調べると ELMAH が便利且つ、実装が簡単そうだったので ELMAH でやってみることとした

ELMAH とは

ELMAH とはError Logging Modules and Handlersの略であり、アプリケーション全体のエラーログ機能の管理を簡単な設定を書くだけで実装ができるプラグインである。 エラーログはデータベースに保存をして、ホスト URL/elmah でログを見ることができる

プロジェクトに ELMAH をインストール

まず ELMAH をプロジェクトに入れていく。 Nuget 管理画面の追加で”elmah”と打つと下記画面となり、今回は.NET MVC なのでElmah.MVCをインストールする。

Nuget画面

インストールすると Web.config に自動的に ELMAH 設定関連のコードが追加される。メールを送る設定や認証ユーザーしかアクセスできない制限等も web.config で行うが今回は最低限の動作までを対象とするので割愛する。

データベースにテーブルとストアドプロシージャを追加する

こちらの github をダウンロードして、/db/database.sql ファイルを実行する。 いろんな実行方法があるが今回は Microsoft SQL Server Management Studio で実施した。Microsoft SQL Server Management Studio の接続に関してはこちらの記事を参照していただきたい。

実行するときは最初の USE 文のところだけ追加したいデータベース名を入れる

USE [***] ←***にはデータベース名を入れる
GO
/****** Object:  Table [dbo].[ELMAH_Error]    Script Date: 03/02/2011 22:37:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ELMAH_Error](
        \[ErrorId\] [uniqueidentifier] NOT NULL,
        \[Application] [nvarchar\](60) NOT NULL,
        \[Host] [nvarchar\](50) NOT NULL,
        \[Type] [nvarchar\](100) NOT NULL,
        \[Source] [nvarchar\](60) NOT NULL,
        \[Message] [nvarchar\](500) NOT NULL,
        \[User] [nvarchar\](50) NOT NULL,
        \[StatusCode\] [int] NOT NULL,
        \[TimeUtc\] [datetime] NOT NULL,
        \[Sequence\] [int] IDENTITY(1,1) NOT NULL,
        \[AllXml\] [ntext] NOT NULL,
    CONSTRAINT [PK_ELMAH_Error] PRIMARY KEY NONCLUSTERED
(
        [ErrorId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

実行が正常にできるとテーブルとストアドプロシージャに追加されていることが確認できる

SQLオブジェクトエクスプローラー

Web.config での接続設定

最後に Web.config の errorLog の接続文字列名を変更追加したら実装は完了となる。

<elmah>
    <security allowRemoteAccess="0" />
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="DefaultConnection" />
</elmah>

接続文字列名は connectionStrings の name 属性に入れている値を入力する。

<connectionStrings>
    <add name="DefaultConnection" connectionString="*********" providerName="System.Data.SqlClient" />
</connectionStrings>

実装の確認

ローカルで実行する場合は localhost:*/elmah にアクセス(何かエラーを故意に起こしてから)すると下記のような画面が出る。 Details をクリックするとより詳細な情報が確認できる。

elmah確認画面

まとめ

エラーログ出力を自分で実装するとなると結構大変だが、ELMAH を使うことにより実装コストが大幅に削減できるのでおすすめである。他にもプラグインがあったのでそちらも試してみようと思う。


Profile picture

Written by Mittsu
ベンチャー企業のしがないエンジニア。趣味はサッカーとTCG.

© 2024