• 技术文章 >php教程 >PHP源码

    用php写了个正则解析nginx的access log

    PHP中文网PHP中文网2016-05-25 17:10:35原创933
    对于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的状况会如何
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:正则验证输入方法集合,带有防注入性质 下一篇:淘宝开放API根据卖家昵称获取卖家店铺ID
    千万级数据并发解决方案

    相关文章推荐

    • PHP使用mail函数发送邮件标题乱码问题解决方法 • Session Manager by Redis• Yaf框架入门只hello yaf• PHP 截取中文字符串(支持多种编码)• PHP session实现跨子域的几种办法
    1/1

    PHP中文网