本文實例講述了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 );//Vevb.com
- return $return;
- }
備注:由于日志文件過了凌晨會切割,所以需要做一下判斷,判斷是第二天的日志需要從日志文件頭部進行讀取。
需要優化的邏輯:當中間進程掛了,停了一段時間,再啟動時,從上次的位置重新讀取,提交的數據會比較大,可能會超過提交數據大小的限制。
新聞熱點
疑難解答