Webalizerで URLエンコード文字列を扱うには?
   
	
		
	
 
   
  
 
	
 
Webalizerの日本語化(UTF8化)は、以下の記事でできるようになったと思います。
ほとんどの場合、これでOKなんですが、検索文字列についてはうまく行かないことがあります。
 
この % で表現されるURLエンコード文字列です。
今回は、このURLエンコード文字列をWebalizerで対応する一つの方法について、簡単に解説してみます。
また、Webalizerを使うための設定例(apache,logrotate,cron,webalizer) での設定例を基本に解説します。
 
WebalizerでURLエンコード文字列に対応する方法
WebalizerでURLエンコード文字列に対応する一つの方法は、Webalizerでログ情報を集計する前に、URLエンコード文字列をデコードしてしまえば良いだけです。
この対処は、perlでの記述が多いのですが、ここではphpで記述してみます。
- phpでログファイルをURLエンコード文字列をデコードする。
 
以下のphpコードは、非常に簡単なphpコードですが、簡単に解説しておきます。
 
 
- 入力パラメータ(ディレクトリ)をチェック
- 入力パラメータがディレクトリかをチェック
- ディレクトリ配下の拡張子 .1.gz のファイルを検索 
- gzipファイルをオープン
- gzipファイルから1行づつ読み込みURLデコードを実施
- gzipファイルへURLデコードした情報を書き込む
 ここでは、/usr/local/bin/postlogrotate.php というファイル名で作成します。 | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 | <?php
 
//  入力パラメータ(ディレクトリ)をチェック
$dir='';
if(count($argv)>1){
	$dir=$argv[1];
}
if(empty($dir)){
	echo "empty!!\n";
	exit;
}
 
//  入力パラメータがディレクトリか?
if (is_dir($dir)) {
	//  ディレクトリ配下の拡張子 .1.gz のファイルを検索 
	foreach (glob($dir."*.1.gz") as $filename) {
		echo "$filename size " . filesize($filename) . "\n";
		$str_buff = '';
 
		//  gzipファイルをオープン
		$handle = gzopen($filename, 'r');
		if (!$handle) {
			echo "Error\n";
			continue;
		}
		while (!gzeof($handle)) {
			//  gzipファイルから1行づつ読み込みURLデコードを実施
			$buffer = gzgets($handle, 4096);
			$str_buff .= rawurldecode($buffer);
		}
		gzclose($handle);
 
		if(!empty($str_buff)){
			//  gzipファイルへURLデコードした情報を書き込む
			$handle = gzopen($filename,'w9');
			if ($handle) {
				gzwrite($handle, $str_buff);
				gzclose($handle);
			}
		}
	}
} else {
	echo "not DIR\n";
}
 
?>
 |  
 
使い方は、以下のような感じです。
 パラメータに対象となるログファイルがあるディレクトリを指定します。
 
 | $ php /usr/local/bin/postlogrotate.php /var/log/httpd/ 
 |  
 
 
- ログローテーションの設定ファイルに先のphpを実行するように設定する。
 
先のphpファイルをログローテーション実行後に起動するようにログローテーションの設定ファイル( /etc/logrotate.d/httpd ) を編集します。
 | /var/log/httpd/*.log {
    daily
    missingok
    rotate 90
    compress
    ifempty
    create 660 root wheel
    sharedscripts
    postrotate
        /sbin/service httpd graceful
        /usr/bin/php /usr/local/bin/postlogrotate.php /var/log/httpd/
    endscript
}
 |  
 
postrotate – endscript 間に起動イメージを記述するだけです。ここに設定することでログローテーション実行後に実行されます。
 
php のパスは、which コマンドで確認してください。 | $ which php /usr/bin/php
$  
 |  
 
 
Webalizerを使うための設定例(apache,logrotate,cron,webalizer) での設定例であれば、これだけです。意外と簡単でしょ。
案外、簡単だったでしょ。
でも、ちょっと無駄な面もあります。gzipで圧縮しているファイルを解凍して、再圧縮しているのは、ちょっと無駄です。
ここのやり方をする場合は、ログローテーションの設定で、圧縮するのは、無駄かもしれません。
色々とやり方はあると思いますので、一つのやり方として参考になればうれしく思います。
 
		ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
		このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
		
	
関連記事 : 
  
 	
コメントを投稿 :