PHP简单实现定时监控nginx日志文件功能示例
发布:smiling 来源: PHP粉丝网 添加日期:2018-10-19 11:07:21 浏览: 评论:0
本文实例讲述了PHP简单实现定时监控nginx日志文件功能。分享给大家供大家参考,具体如下:
此功能是为了实现,定时监控nginx生成的日志数据,并将新增的数据提交到一个接口(比如大数据的接口,让大数据来进行分析)。
- define("MAX_SHOW", 8192*5); //新增数据提交阈值
- define("LOG_NAME", ""); //读取的日志文件
- define("LOG_SIZE", ""); //保留上次读取的位置
- define("LOG_URL", ""); //日志提交地址
- //运行时log文件原始大小
- $log_size = get_filesize();
- $file_size = filesize(LOG_NAME);
- if(emptyempty($log_size)){//没有记录上次位置,则从当前位置开始
- $file_size = $file_size;
- }else if($log_size > $file_size){ //说明是第二天的日志文件,指针放到文件头
- $file_size = 0;
- }else{ //从上次记录的位置开始
- $file_size = $log_size;
- }
- $file_size_new = 0;
- $add_size = 0;
- $ignore_size = 0;
- $fp = fopen(LOG_NAME, "r");
- while(1){
- clearstatcache();
- $read_num = 0;
- $file_size_new = filesize(LOG_NAME);
- $add_size = $file_size_new - $file_size;
- $add_data = array();
- $add_log = '';
- if($add_size > 0){
- //大于一个阈值提交数据
- if($add_size > MAX_SHOW){
- fseek($fp, $file_size);
- //当增加量超过8192,需要分页读取增加量
- $page = ceil($add_size/8192);
- for($i=1; $i<=$page; $i++){
- if($i == $page){//最后一页
- $end_add = $add_size - ($page -1) * 8192;
- $add_log .= fread($fp, $end_add);
- }else{
- $add_log .= fread($fp, 8192);
- $file_size_step = $file_size + $i * 8192;
- fseek($fp, $file_size_step);
- }
- }
- $add_data['add_log'] = $add_log;
- $add_data['add_log'] = base64_encode($add_data['add_log']);
- http_post(LOG_URL, $add_data);
- $file_size = $file_size_new;
- //记录当前位置
- save_filesize($file_size);
- }
- }else if($add_size < 0){ //第二天从头部开始
- $file_size = 0;
- }
- sleep(2);
- }
- fclose($fp);
- /**
- * 每次启动时获取上次打开文件位置
- */
- function get_filesize(){
- $size = file_get_contents(LOG_SIZE);
- return $size;
- }
- /**
- * 每次提交后保存这次读取文件的位置
- */
- function save_filesize($size){
- return file_put_contents(LOG_SIZE, $size);
- }
- /**
- * http请求
- * @param array $data
- * @return boolean
- */
- function http_post($url = '', $data = array())
- {
- if(emptyempty($url)){
- return FALSE;
- }
- if($data){
- $data = http_build_query($data);
- }
- $ch = curl_init ();
- curl_setopt ( $ch, CURLOPT_URL, $url );
- curl_setopt ( $ch, CURLOPT_POST, 1 );
- curl_setopt ( $ch, CURLOPT_HEADER, 0 );
- curl_setopt ( $ch, CURLOPT_TIMEOUT, 5 );
- curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
- curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
- $return = curl_exec ( $ch );
- curl_close ( $ch );//phpfensi.com
- return $return;
- }
备注:由于日志文件过了凌晨会切割,所以需要做一下判断,判断是第二天的日志需要从日志文件头部进行读取。
需要优化的逻辑:当中间进程挂了,停了一段时间,再启动时,从上次的位置重新读取,提交的数据会比较大,可能会超过提交数据大小的限制。
Tags: 示例 功能 文件
相关文章
- ·PHP中的cURL请求及示例学习笔记(2014-07-03)
- ·php计划任务示例详解(2014-07-12)
- ·php XMLWriter类的简单示例(2014-08-20)
- ·PHP编程实现的TCP服务端和客户端功能示例(2018-06-06)
- ·使用PHP访问RabbitMQ消息队列的方法示例(2018-06-11)
- ·php PDO实现的事务回滚示例(2018-08-29)
- ·Python实现文件内容批量追加的方法示例(2018-08-31)
- ·利用PHP实现开心消消乐的算法示例(2018-09-09)
- ·PHP memcache在微信公众平台的应用方法示例(2018-09-13)
- ·PHP服务器端API原理及示例讲解(接口开发)(2018-09-14)
- ·PHP使用pdo实现事务处理操作示例(2018-09-14)
- ·php apidoc生成接口文档示例(2018-09-19)
- ·PHP实现多个关键词搜索查询功能示例(2018-10-11)
- ·Laravel框架路由设置与使用示例(2018-10-19)
- ·PHP设计模式之装饰器模式定义与用法简单示例(2018-10-19)
- ·php实现memcache缓存示例讲解(2020-07-13)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)