-2

我要分析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>
4

1 回答 1

0

不要尝试重新发明轮子。始终尝试寻找其他人可能开发的工具。Web 服务器已经存在了很长时间,因此有大量的日志解析器和服务器工具。

试试这个 PHP 解析器,节省一些时间。

https://github.com/kassner/log-parser

如前所述,我不会对实时文件执行此操作。您可能应该每 5 或 10 分钟设置一次 cronjob,并更频繁地轮换文件。并使用最近旋转的文件。但是,这可能会导致大量文件堆积。

于 2015-01-30T21:38:04.980 回答