PHPスクリプトで、apacheのアクセスログから、特定URLのPUTメソッドだけ取り出して、MySQLにINSERTしてみた。
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 |
<?php $link = mysqli_connect('localhost', 'root', ''); mysqli_select_db($link, 'laravel'); $logfile = [ 'access_log.20220801','access_log.20220802','access_log.20220803' ]; for($i=0; $i<count($logfile); $i++){ echo date("Y-m-d H:i:s"). " $logfile[$i]\n"; if(($fp = fopen($logfile[$i], "r"))){ while(!feof($fp)){ $buffer = fgets($fp); if(!empty($buffer)){ /* * $info[0]: IPアドレス * $info[1]: アクセス時間 * $info[2]: アクセスメソッド * $info[3]: アクセスパス */ $info = explode(",", preg_replace('/^([\S]+)[^\[]+\[([^\]]+)\]\s+"(\S+)\s(\S+).*/', "$1,$2,$3,$4,", $buffer)); $date = date("Y-m-d H:i:s", strtotime($info[1])); // unix時間に変換してフォーマット $method = $info[2]; $path = $info[3]; $sql = ''; if($method == 'PUT' && preg_match("/\/api\/building\/(\d{8})/", $path, $b_code)){ // echo "$date $method $path $b_code[1]\n"; $sql = "INSERT INTO `building_floor_history_logs` (`b_code`, `f_code`, `history_message`, `history_message_kind`, `check_date`) VALUES ('$b_code[1]', NULL, 'ビル情報を更新しました。', 100, '$date');\n"; } if(!empty($sql)){ mysqli_query($link, $sql); } } } fclose($fp); } } mysqli_close($link); |