ログファイルを日毎に分けたいのでcronologをまずインストールする。
tar zxvf cronolog-1.6.1.tar.gz cd cronolog-1.6.1 ./configure make su make install
JAPACHEから配布されているapacheのダウンロードサイトから最新版を
ダウンロード
http://japache.infoscience.co.jp/apache/dist/
Configureで apache関連ファイルのインストール先を /usr/local/wwwに指定、参照ログを扱いやすくするため mod_log_refererを 有効にする。
tar zxvf apache_1.3.12.tar.gz cd apache_1.3.12 ./configure --prefix=/usr/local/www --enable-module=log_referer make su make install
設定ファイル /usr/local/www/conf/httpd.conf で以下の設定を変える。
ログファイルを日毎に分けるようにしたのでログの中には日付は要りません。 なので時刻の文字列を作成するところを改造します。
ファイル: src/modules/standard/mod_log_config.c
関数: log_request_time()において
ap_snprintf(tstr, sizeof(tstr), "%02d:%02d:%02d", t->tm_hour, t->tm_min, t->tm_sec );
ファイル: src/main/http_log.c
関数: log_error_core()において
if (logf) { time_t tt = time(NULL); len = strftime( errstr, sizeof(errstr), "%H:%M:%S ", localtime(&tt) ); } else { len = 0; }
ログファイル名が |(パイプ)で始まる場合には、それをコマンドとして 実行するのですが、コマンド引数の解釈を sh に託しているので プロセスが sh の分だけ多く走ってしまいます。そこで引数を自分で 分割して execv関数を使うことで shを使わないようにします。
ファイル: src/main/http_log.c
関数: piped_log_spawn()において
char str[256]; char* argv[4]; int i=0; strcpy( str, pl->program ); for( argv[i++]=strtok( str," "); (argv[i++]=strtok(NULL," ")); ); execv( argv[0], argv ); /******* execl(SHELL_PATH, SHELL_PATH, "-c", pl->program, NULL); *******/
関数: error_log_child()において
char str[256]; char* argv[4]; int i=0; strcpy( str, cmd ); for( argv[i++]=strtok( str," "); (argv[i++]=strtok(NULL," ")); ); execv( argv[0], argv ); /******* execl(SHELL_PATH, SHELL_PATH, "-c", (char *)cmd, NULL); *******/
参照ログにはサーチエンジンにGETメソッドで与えられたFORM変数の データが付随していることが多いのですが、そのままではURLエンコード されていたり漢字コードが異なっていたりするので読めません。なので 参照ログを出力するところで、 これを復号して漢字コードを自分が読めるコードに変換するように 改造します。
本書のform.ccにおいて Decode関数の プロトタイプ宣言をとその定義にextern "C" 宣言を付ける。
main関数を除いておく。-c オプションを付けてコンパイル。 出来た form.o を src/module/standard/ に置く。extern "C" char* Decode( char* src ); extern "C" char* Decode( char* src ) { ... return src; }
ファイル:src/module/standard/Makefile
OBJS の項目に form.o 加える。
ファイル:src/module/standard/mod_log_referer.c
冒頭において
関数: referer_log_transaction()において#include "http_core.h" extern char *DecodeURL( char *buffer );
const char *referer; const char *host; /* 追加 */
referer = ap_table_get(orig->headers_in, "Referer"); host = ap_get_remote_host(orig->connection, orig->per_dir_config, REMOTE_NAME); /* 追加 */
str = ap_pstrcat(orig->pool, DecodeURL(referer), " ",host," ", r->uri, "\n", NULL); /* 変更 */
これで参照ログを調べることで、 サーチエンジンにどのようなキーワードを入れて自分のページに たどり着いたのかがわかります。またどこからリンクが張られているかも わかってきます。