日本語を含むApacheのログをデコードする


PHP で Web アプリを開発している際、日本語を含むメッセージ等が Apache のログにエンコード(結果的に文字化け)されて出力される場合があります。そんな時のためのフィルタです。

例)WordPress 利用時のデバッグ出力

(適当に改行しています)

hotta@host:~$  tail -f /var/log/httpd/error_log
[Mon Aug 05 16:22:10 2013] [error] [client 10.28.1.53] PHP Notice:  add_custom_image_header 
\xe3\x81\xae\xe4\xbd\xbf\xe7\x94\xa8\xe3\x81\xaf\xe3\x83\x90\xe3\x83\xbc\xe3\x82\xb8\xe3
\x83\xa7\xe3\x83\xb3 3.4 \xe3\x81\x8b\xe3\x82\x89 <strong>\xe9\x9d\x9e\xe6\x8e\xa8\xe5\xa5\xa8</strong>
\xe3\x81\xab\xe3\x81\xaa\xe3\x81\xa3\xe3\x81\xa6\xe3\x81\x84\xe3\x81\xbe\xe3\x81\x99! 
\xe4\xbb\xa3\xe3\x82\x8f\xe3\x82\x8a\xe3\x81\xab add_theme_support( 'custom-header', $args )
\xe3\x82\x92\xe4\xbd\xbf\xe3\x81\xa3\xe3\x81\xa6\xe3\x81\x8f\xe3\x81\xa0\xe3\x81\x95\xe3\x81\x84\xe3\x80\x82 
in /var/www/wp-sample/wp-includes/functions.php on line 2841, 
referer: http://www.example.com/wp-admin/post.php?post=31&action=edit 

フィルタを通した出力例

(適当に改行しています)

hotta@host:~$  tail -f /var/log/httpd/error_log | cvtlog.php
[Mon Aug 05 16:32:19 2013] [error] [client 10.28.1.53] PHP Notice:  add_custom_image_header 
の使用はバージョン 3.4 から<strong>非推奨</strong>になっています!
代わりに add_theme_support( 'custom-header', $args ) を使ってください。 
in /var/www/wp-sample/wp-includes/functions.php on line 2841, 
referer: http://www.example.com/wp-admin/post.php?post=31&action=edit

以下のスクリプトを /usr/bin あたりに入れておくと便利です。

#!/usr/bin/php
<?php
//---------------------------------------------------------------------
//  エンコードされた UTF-8 文字列を含むデータを表示する
//
//      使用法:  ./cvtlog.php < ログファイル等
//---------------------------------------------------------------------
function    pack_func($matches) // $matches[] = array('\xXX', '\xXX');
{
   $tmp = sscanf('0' . substr($matches[0], 1), "%x");
   $digit = $tmp[0];
   $packed = pack('C', $digit);
   return  $packed;
}
while ($line = fgets(STDIN))   {
   print preg_replace_callback('/\\\x[0-9a-f]{2}/', 'pack_func', $line);
}

Go previous Go ahead Go up