アプリ版:「スタンプのみでお礼する」機能のリリースについて

大変、困っていますので宜しくお願いします。

社内で構築している、WEBサーバー(Apache)のエラーログに、
日本語の箇所が、16進数で表示されてしまいます。
Apacheのサイトで、以下のような文章を見つけましたが、
「認識不能」という箇所において、何故日本語が認識不能になってしまうのかがわからずに、解決に至っておりません。
尚、WEB画面の表示については、問題ありません。あくまで、エラーログのみ日本語の認識ができていないようです。

情報元URL:http://httpd.apache.org/docs/2.0/ja/mod/mod_log_ …
<引用 はじめ>
セキュリティ上の理由により 2.0.46 より印字不可能な文字と 他の特別な文字は、ほとんど \xhh という 文字列でエスケープされるようになりました。<引用 終わり>

*環境*
OS:CentOS 4.4 WEB:Apache 2(httpd-2.0.52-28.ent.centos4)
Perl:perl-5.8.5-36.RHE
LANG="en_US.UTF-8"(これは、日本語にしても同じ結果でした・・)

A 回答 (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名で置いて、コマンドラインから実行させれば出来ますけどね
そんな方法はイラン!ってことならご免です。

この回答への補足

ご回答の程、ありがとうございました。
こういった回避方法があるとの事で、大変参考になりました。
しかし、できましたらモジュールの追加や設定でエスケープ文字を回避したいと考えております。
今回の質問内容について、補足になりますが、このエラーログが表示されてしまうのは、
特定の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
------------------------------------------

補足日時:2006/10/18 12:18
    • good
    • 0

となるとパイプ処理ですかね


http://httpd.apache.org/docs/2.0/ja/mod/core.htm …
によると
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 )
    • good
    • 0
この回答へのお礼

ご回答の程、ありがとうございました。

Apacheの挙動については、不明のままですが、
ログファイルに、Perlで処理させて、日本語表示が可能になりましたので、この方向で処理をしたいと考えています。
大変、助かりました。ありがとうございます。

お礼日時:2006/10/19 20:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!