温馨提示: 请在Chrome、Firefox等现代浏览器浏览本站。

分享​PHP​简单​实现​准时监控nginx日志文件功

php技术 admin 评论

本文实例讲述了PHP简单实现准时监控nginx日志文件功能。分享给大家供大家参考,具体以下: ​此功能是为了实现,准时监控nginx生成的日志数据,并将新增的数据提交到一个接口(比

本文实例讲述了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(empty($log_size)){//没有记录上次位置,则从当前位置最先

$file_size=$file_size;

}elseif($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);

}

}elseif($add_size<0){//第二天从头部最先

$file_size=0;

}

sleep(2);

}

fclose($fp);

/**

*每次启动时获得上次打开文件位置

*/

functionget_filesize{

$size=file_get_contents(LOG_SIZE);

return$size;

}

/**

*每次提交后保存此次读取文件的位置

*/

functionsave_filesize($size){

returnfile_put_contents(LOG_SIZE,$size);

}

/**

*http请求

*@paramarray$data

*@returnboolean

*/

functionhttp_post($url='',$data=array)

{

if(empty($url)){

returnFALSE;

}

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);

return$return;

}

备注:由于日志文件过了凌晨会切割,所以需要做一下判断,判断是第二天的日志需要从日志文件头部进行读取

需要优化的逻辑:傍边间进程挂了,停了一段时候,再启动时,从上次的位置重新读取,提交的数据会比较大,可能会超过提交数据大小的限制

发表我的评论
取消评论

表情

您的回复是我们的动力!

  • 昵称 (必填)
  • 验证码 点击我更换图片
  • 网友最新评论