【備忘録】ASP.NETでイベントログが書けない問題

システム開発

ASP.NETのWebアプリを他のPCにデプロイした際に発生した問題の備忘録。

表記の通り、ASP.NET(.NET Framework)でエラー時にApplicationにイベントログを出力するコードを書いた場合に、実際にイベントログを出力する場所で、FindSourceRegistration() やアクセス権限無しなどのエラーが出て「結局書き込めないやん」が発生した場合です。

対処方法

2つあって、

  • 1.イベントログへの「アクセス権限」追加と
  • 2.イベントソースという識別子を登録

しておくことです。両方ともレジストリを変更しますので作業は要注意。

1.イベントログへのアクセス権限追加

レジストリエディタを開いて、以下のキーを探す。

¥¥HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥EventLog¥Security

キーを右クリックして、「アクセス許可」を選択

「追加」クリックして「NETWORK SERVICE」を追加。アクセス許可に「読み取り」権限を付与してOK

2.イベントソースの登録

プログラムコードで、イベントログを書き出す際のイベントソースを探してメモ。
(WriteEntoryの第1引数の文字列)
例: EventLog.WriteEntry("HogeHoge Source", Message ); なら「HogeHoge Source」

レジストリエディタで、以下に移動

¥¥HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥EventLog¥Application

キーを右クリックして、「新規」→「キー」を選択

「新しいキー #1」となっている場所に探したキー名を記載してエンター

以上の設定で、IISのプロセス(NETWORK SERVICE)がレジストリの読み取り、とイベントログApplicationへ書きだしを行うことがでるようになります。
ぶっちゃけ、IIS のプロセスをAdministratorsのグループに入れるという強硬手段もありますが、セキュリティとして良くない(乗っ取られるとなんでも出来ちゃう)ので、イベントソースをあらかじめ登録しておくのが良いと思います。

この作業は最初のデプロイ時に1回だけ行えば良いです。なお、レジストリエディタで、登録したキーをエクスポートすれば、REGファイルを作成できるので、初期デプロイ時にこいつを実行してレジストリに登録するのが一番安全ですね。

なお、イベントソース名をレジストリに登録しているということは、
ソース名を変えたり、新しく追加した際はその登録が必ず必要になります。

原因って何なの?

イベントログへのアクセスはプログラム実行者がAdministrator権限があると、権限強いために初期のイベントソース登録やら何やらがエラー無しで動いちゃうんです。なので、開発環境のVisualStudioでデバッグ中はデバッグ実行者の権限(Administratorsに入っていることが多いんじゃ❓)で勝手にイベントソースが追加されてイベントログが書き出されています。一度イベントソースが作成されてしまえば、その後開発環境のIISで動作確認してもちゃんと出力されてエラーにならない。
できあがったWebアプリを実行環境にあるPCにデプロイすると、このイベントソースが作成されていないため、イベントログを書き込むところで落ちちゃうんですね。
イベントログ出力部分って大抵Catchとかの中なので、処理されない例外として出てきてビックリ❗と
納得です。

無駄に悩んだのでメモです。

タイトルとURLをコピーしました