对于 nginx 的日志分析, awstats + jawstats 是一个很好的解决方案
最近有个任务需要对接口的调用做二次分析统计, 于是用 php 写了个正则解析日志, 用 Highcharts 报表,
nginx.conf 对 log 的默认格式是这样定义的
log_format access '$remote_addr - $remote_user [$time_local]"$request"''$status $body_bytes_sent "$http_referer" ''"$http_user_agent"$http_x_forwarded_for';
每行的记录大概如下
192.168.192.168 - - [31/Jul/2012:14:17:45 +0800] "GET /a/b/c/d.txt?device_id=BF771F68-6B0C-41D0-9F7E-3A24294B17DF HTTP/1.0" 200 1039 "-" "LifeStyleTiring-Room/1.0 CFNetwork/548.1.4 Darwin/11.4.0"
每天用 crontab 把记录切割并解析, 每次读入 100 行, 提取有用部分预处理存入 sql, 为报表做准备
目前数据量不多, 还没有做性能测试
1. [代码] 用 php 解析 nginx 的访问日志
- <?php
- $s_line = '192.168.192.168 - - [31/Jul/2012:14:17:45 +0800]"GET /a/b/c/d.txt?device_id=BF771F68-6B0C-41D0-9F7E-3A24294B17DF HTTP/1.0"200 1039"-""LifeStyleTiring-Room/1.0 CFNetwork/548.1.4 Darwin/11.4.0"';
- $p = '/^(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})\s-\s(.*)\s\[(.*)\]\s"(.*)\"\s(\d{3})\s(\d+)\s"(.*)"\s\"(.*)\"(.*)$/u';
- preg_match($p,$s_line,$a_match);
- var_dump($a_match);
- // 还不知道 ipv6 的状况会如何
来源: https://www.php1.cn/detail/php-b6118bb01a.html