我想分析access_log,然后将访问者ip,日期,页面浏览量或图像视图存储到mysql表中。
我打算每分钟使用cron作业调用一个php脚本,打开access_log。
但现在access_log
已经超过500MB,每分钟将增加约0.4MB。(通常为 50-350 条记录)
那么如何在PHP中打开这么大的文件呢?读取最后500条记录,然后正则表达式获得最后一分钟的记录。我的服务器有 32GB RAM,内存没有问题,但我需要较低的 CPU 使用率。任何人都可以用简单的代码帮助我吗?谢谢。
编辑
接受@Jeremiah Winsley的建议,我在我的httpd.conf中使用rotatelogs。但尚未创建日志。问题出在哪里?
<IfModule log_config_module>
LogFormat "%h %l %u %t '"%r'" %>s %b '"%{Referer}i'" '"%{User-Agent}i'"" com bined
LogFormat "%h %l %u %t '"%r'" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t '"%r'" %>s %b '"%{Referer}i'" '"%{User-Agent}i'" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined env=!dontlog
CustomLog "|sbin/rotatelogs -f logs/my_log 60" combined env=!dontlog
#create a my_log every 1 minute.
SetEnvIf Remote_Addr "127'.0'.0'.1" dontlog
SetEnvIf Remote_Addr "::1" dontlog
</IfModule>
不要尝试重新发明轮子。始终尝试并搜索其他人可能已经开发的工具。Web服务器已经存在了很长时间,因此有大量的日志解析器和服务器工具。
试试这个PHP解析器,节省一些时间。
https://github.com/kassner/log-parser
如前所述,我不会在实时文件上执行此操作。您可能应该每 5 或 10 分钟设置一次 cronjob,并更频繁地旋转文件。并使用最近旋转的文件。但是,这可能会导致大量文件堆积。