Maison >développement back-end >tutoriel php >PHP implémente la fonction de surveillance régulière des fichiers journaux nginx

PHP implémente la fonction de surveillance régulière des fichiers journaux nginx

不言
不言original
2018-06-28 15:33:531279parcourir

Cet article présente principalement PHP pour simplement implémenter la fonction de surveillance régulière des fichiers journaux nginx, impliquant la lecture régulière par PHP des journaux du serveur nginx et les compétences opérationnelles associées basées sur la transmission de données basée sur curl. Les amis dans le besoin peuvent se référer à cet article

L'exemple décrit comment PHP implémente simplement la fonction de surveillance régulière des fichiers journaux nginx. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Cette fonction consiste à surveiller régulièrement les données de journal générées par nginx et à soumettre les nouvelles données à une interface (telle que l'interface big data, afin que big data pour analyse)

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;
}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[&#39;add_log&#39;] = $add_log;
      $add_data[&#39;add_log&#39;] = base64_encode($add_data[&#39;add_log&#39;]);
      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 = &#39;&#39;, $data = array())
{
  if(empty($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 );
  return $return;
}

Remarque : étant donné que le fichier journal sera coupé tôt le matin, vous devez porter un jugement pour déterminer si le prochain le journal du jour a besoin Lecture à partir de l'en-tête du fichier journal

Logique qui doit être optimisée : lorsque le processus intermédiaire se bloque, s'arrête pendant un certain temps, puis redémarre, il sera relu à partir du dernier position, et les données soumises seront plus volumineuses. Elles peuvent dépasser la limite de taille des données soumises

Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Explication détaillée de la façon dont PHP utilise l'extension zlib pour implémenter la sortie de compression GZIP

PHP implémente le cache mémoire distribué paramètres Explication détaillée de la méthode de synchronisation de session de cluster Web

Explication complète de l'exemple de la classe d'opération de base de données mongoDB implémentée par PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn