- ベストアンサー
Apacheのエラーログで日本語を表示させる方法とは?
- 社内で構築しているWEBサーバー(Apache)のエラーログに、日本語の箇所が16進数で表示されてしまう問題に困っています。
- Apacheのサイトで調べた結果、セキュリティ上の理由により2.0.46以降では印字不可能な文字と他の特別な文字はエスケープされるようになっています。
- しかし、なぜ日本語が「認識不能」となってしまうのか解決できていません。WEB画面の表示には問題はないため、この問題を解決する方法を知りたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Apache2.2も確認しましたが同じくセキュリティ上の理由と有るので、 logの出力formatをいじるのは諦めて error_logを別fileにコンバートするスクリプトをおいたらどうでしょう? #! /usr/bin/perl $read_file='error_log'; $out_file = 'jp-'. $read_file .'.txt'; open (R,$read_file); open (J,">$out_file"); while(<R>) {s/\\x([a-f\d]{2})/pack("C", hex($1))/ieg; print J; } close (R); close (J); print 'Success!! ' . localtime() ."\n\n"; __END__ こんなのを log_conv.pl などのfile名で置いて、コマンドラインから実行させれば出来ますけどね そんな方法はイラン!ってことならご免です。
その他の回答 (1)
- umasikajiro
- ベストアンサー率67% (545/803)
となるとパイプ処理ですかね http://httpd.apache.org/docs/2.0/ja/mod/core.html#errorlog によると ErrorLog "|/usr/local/bin/httpd_errors" と言う様に処理するプログラムを指定すれば出来るとありますが 私がやってみた限りではうまくいきませんでした。 httpd.confに ErrorLog "|/home/hoge/er_jp" と記述してスクリプトを指定し /home/hoge/er_jpではSTDINを読んで 1.そのままの内容を書き込み(デフォルトログ) 2.デコードして別fileに書き込み(日本語化ログ) しましたが、Apacheの起動時のメッセージは記録されますが .htaccessにわざと日本語を記述して500errorにしてもログに記録されませんでした 一応内容を貼っておきます #! /usr/bin/perl $en_file='/home/hoge/test_error_log.txt'; $jp_file = '/home/hoge/jp--er_log.txt'; open (E,">>$en_file"); open (J,">>$jp_file"); foreach(<STDIN>) { print E ; s/\\x([a-f\d]{2})/pack("C", hex($1))/ieg; print J ; } close (E); close (J); __END__ うちのはFedora5+Apache2.2.0ですので、その環境のためかもしれません。 >また、Apacheは、どの部分で、「印字不可能な文字」と判断しているのでしょうか? セキュリティの意図としては制御文字を埋められることを避けるためでしょうが 実際には単純に半角英数字や記号の他はすべてエスケープしているのでは? >これは、Perlのモジュールの追加で回避できる類のものでしょうか? 内容がわからないので何とも、、、 デバッグの手順としては(PerlのCGIの場合、file名をhoge.cgiとすると) コマンドラインから 1. $ perl -wc hoge.cgi <=と打って Syntax OK が出ればOK 2. $ ./hoge.cgi <= 最初に意図したヘッダが出力されるかTEST ブラウザで 3. hoge.cgi にアクセスしてみる 4. eror_log を見る 5. Suexecなら logs/suexec.log も見てみる ( http://oshiete1.goo.ne.jp/qa2469513.html )
お礼
ご回答の程、ありがとうございました。 Apacheの挙動については、不明のままですが、 ログファイルに、Perlで処理させて、日本語表示が可能になりましたので、この方向で処理をしたいと考えています。 大変、助かりました。ありがとうございます。
補足
ご回答の程、ありがとうございました。 こういった回避方法があるとの事で、大変参考になりました。 しかし、できましたらモジュールの追加や設定でエスケープ文字を回避したいと考えております。 今回の質問内容について、補足になりますが、このエラーログが表示されてしまうのは、 特定のCGIファイルでおきています。 これは、Perlのモジュールの追加で回避できる類のものでしょうか? また、Apacheは、どの部分で、「印字不可能な文字」と判断しているのでしょうか? (1.3系では問題なく表示されておりました) 質問が重なってしまい申し訳ありませんが、ご回答頂ける方は、ご教授の程、宜しくお願い致します。 インストールされている、Perlモジュール一覧 ------------------------------------------ perl-CGI-Lite perl-NKF perl-Time-HiRes perl-Filter perl-Text-Template perl-Crypt-DES perl-DBI perl-DBD-Oracle ------------------------------------------