LoginSignup
9
13

More than 5 years have passed since last update.

php を使って apache のログを解析するさらにもう一つの方法

Posted at

すっかり言い尽くされているとは思いますが php を利用した apache のログ解析です

apachecombined なログから

  • アクセス元IPアドレス
  • アクセス時間
  • アクセスメソッド
  • アクセスパス

以上の情報を抜き出すには以下の正規表現と preg_replace() を利用する事で簡単に可能です

アクセス時間にはスペースが含まれる可能性があるのでフィールドはスペースではなくカンマで区切っています。

/* IPアドレス,アクセス時間,アクセスメソッド,アクセスパス */
$csv = preg_replace('/^([\S]+)[^\[]+\[([^\]]+)\]\s+"(\S+)\s(\S+).*/', "$1,$2,$3,$4", $line)

このデータはみんな大好き! CSV 型式になので表計算ソフトにも簡単に取りこめるでしょう。

そのまま php のプログラム中で利用する場合は配列にするとアクセスが楽なので配列にしちゃいます。
上で作成した CSV 型式のデータを explode() で配列に分割しています。

/*
 * $info[0]: IPアドレス
 * $info[1]: アクセス時間
 * $info[2]: アクセスメソッド
 * $info[3]: アクセスパス
 */
$info = explode(",", preg_replace('/^([\S]+)[^\[]+\[([^\]]+)\]\s+"(\S+)\s(\S+).*/', "$1,$2,$3,$4,", $line));

apache の標準型式の日付時間フォーマット
dd "/" M "/" YY ":" HH ":" MM ":" SS " " TZ
は php の strtotime() で変換可能ですので、アクセス時間は以下の方法で unix タイムスタンプに変換でき日付時間による計算も簡単に可能です。

$unixtime = strtotime($info[1]);

ログをオープンして特定の時間内ログを加工する場合などは以下のスケルトンになります。

<?php

    /* 30分前から今まで */
    $start = strtotime(date("Y-m-d H:i:00", strtotime("-30 minute")));
    $end = strtotime(date("Y-m-d H:i:00"));

    if(($fp = fopen($logfile, "r"))}{
        while(!feof($fp)){
            $info = explode(",", preg_replace('/^([\S]+)[^\[]+\[([^\]]+)\]\s+"(\S+)\s(\S+).*/', "$1,$2,$3,$4,", fgets($fp)));
            $access = strtotime($info[1]);

        if($access > $start && $access < $end){
            /* 必要な処理 */
        }
        fclose($fp);
    }

?>

厳密なログの書式解析は結構面倒なのですが簡易的な方法なら割と簡単に可能です。

9
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
13