- - PR -
ASP.Net Global.asaxのApplication_Errorでのログ出力
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-03-31 16:54
いつも参考にさせていただいております。
現在、.NET TIPS [ASP.NET]アプリケーション内で発生したエラー情報をロギングするには? http://www.atmarkit.co.jp/fdotnet/dotnettips/168asperrlog/asperrlog.html を参考にエラー時の処理を実装してみました。 protected void Application_Error(Object sender, EventArgs e) { StreamWriter objSw = new StreamWriter(Server.MapPath("/err.log"), true,Encoding.GetEncoding("Shift_JIS")); // 最後に発生したエラー原因情報をExceptionオブジェクトとして取得 Exception objErr = Server.GetLastError().InnerException; // 日付、ソース・コード、エラー・メッセージ、エラー原因となった // メソッドをタブ区切りテキストで記録 StringBuilder objBld = new StringBuilder(); objBld.Append(DateTime.Now.ToString()); objBld.Append("\\t"); objBld.Append(objErr.Source); objBld.Append("\\t"); objBld.Append(objErr.Message); objBld.Append("\\t"); objBld.Append(objErr.TargetSite.ToString()); objSw.WriteLine(objBld.ToString()); objSw.Close(); } これを起動し、エラーが発生させApplication_Errorの処理に移った時に、 StreamWriter objSw = new StreamWriter(Server.MapPath("/err.log"), true,Encoding.GetEncoding("Shift_JIS")); にて、System.UnauthorizedAccessExceptionが発生します。 メッセージ:"パス /"c:/inetpub/wwwroot/err.log/" へのアクセスが拒否されました。"」 ファイルを事前に作成したり、フォルダのセキュリティにて、ASP.NETアカウントに権限を与えてもだめでした。 何かお気づきの点やヒントがありますでしょうか? ぜひどなたかご教授お願いいたします。 | ||||
|
投稿日時: 2005-03-31 18:30
まずは、サンプルを変更せずに動くかを確認ですね。
| ||||
|
投稿日時: 2005-03-31 18:35
err.logの出力先にASP.NETの書き込み権限がないだけでは?
| ||||
|
投稿日時: 2005-03-31 18:56
todoさん、burton999さん、早速のレスありがとうございます!
>まずは、サンプルを変更せずに動くかを確認ですね。 サンプルと違うところは出力先のパス名のみです。 サンプル("/netIns/err.log)⇒ ("/err.log") 最初はサンプルを自前のソースコードに 全てコピーし動作させましたがダメでした。 >err.logの出力先にASP.NETの書き込み権限がないだけでは? err.logのプロパティにてASP.NETアカウントを追加しました。 err.logのプロパティ⇒セキュリティ⇒追加でよいでしょうか? 気になるのは追加をしてもアクセス許可の部分はグレーになっていて 変更ができなくなっているところです。 グレー状ですがチェックはついています。 もしかして見当違いでしょうか?? 知識が乏しくお世話かけます・・・。 なにとぞよろしくお願いいたします。 | ||||
|
投稿日時: 2005-03-31 21:03
エラーログを、外部からアクセスできるところにおくべきではありません。誰かが直接URLを記入して、err.logにアクセスして、それを見ると、アプリケーションにどんな脆弱性があるか、わかってしまいますよね。
##### ***で使用だから大丈夫、とかいわないでくださいね。 ○そのサーバにアクセス出来るすべての人に悪意が全くない ○そのサーバにアクセス出来るすべての人に悪戯気が全くない ○そのサーバにアクセス出来るすべての人は、会社でのことを決して社外の人に話さない などの条件がクリアできるなら、それでも大丈夫でしょうけど。 拡張子によっては、IISがブロックするかもしれませんが、それでもwwwroot$として共有されている場所ですし。 ##### それで、偽装したりしていませんか? _________________ | ||||
|
投稿日時: 2005-04-01 11:16
Jittaさん、ありがとうございます。
確かにその通りですね。 このパスではどこからでもアクセスできてしまいます・・。 今はテスト中なんですが、ログ出力先をローカルのパスに変更すると 仮想ディレクトリではありません等のエラーメッセージがでました。 なかなかうまくいきませんが、もう少し色々やってみようと思います。 みなさま、アドバイスありがとうございました。 何かお気づきの点があればまたよろしくお願いいたします。 | ||||
|
投稿日時: 2005-04-01 12:43
Server.MapPath を呼ばずに、直接ローカルのパスを書けばいいんじゃないでしょうか。 | ||||
|
投稿日時: 2005-04-01 14:07
にしざきさん、ありがとうございます。
すいません。コードの説明をしていませんでした。 ローカルパス指定の時は、Server.MapPathは呼ばず、 直接フルパスを指定してみました。 説明不足で申し訳ございませんでした。 |