~30歳プログラマ歴2年の趣味サイト~
CategoryContactAbout
2020.04.20

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

はじめに

自社サービスは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文のところだけ追加したいデータベース名を入れる

database.sql
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の接続文字列名を変更追加したら実装は完了となる。

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

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

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

実装の確認

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

elmah確認画面

まとめ

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

愛知県在住。プログラマ歴2年目。自動車部品メーカーにて5年程従事した後に、新規一転プログラマの道へ。

現在はベンチャー企業でシステム開発を行っている。メインの使用言語はC#。フロントもJQueryでやっているがReactへの移行を考えている。 短期目標はプログラミング知識を身に着けて自分一人でサービス開発をする、その後中期目標として5年後までにはゲーム開発会社を起業する。 長期目標は楽しく、楽して人生を送りたい。プログラミングは大好き。

仕事、質問、指摘どんなことでも嬉しいのでコンタクトから連絡いただけるとありがたいです。

Gatsby.js + TypeScript + Netlify