>백엔드 개발 >PHP 튜토리얼 >PHP는 nginx 로그 파일을 정기적으로 모니터링하는 기능을 구현합니다.

PHP는 nginx 로그 파일을 정기적으로 모니터링하는 기능을 구현합니다.

不言
不言원래의
2018-06-28 15:33:531279검색

이 글에서는 주로 PHP의 nginx 서버 로그 예약 읽기와 컬 기반 데이터 전송 관련 운영 기술을 포함한 PHP의 간단한 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;
}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;
}

주의사항: 자정 이후에는 로그파일이 잘리기 때문에 다음날 로그는 로그파일의 선두부터 읽어야 한다는 판단이 필요합니다

최적화가 필요한 로직: 중간 프로세스가 일정 시간 동안 중단되고 중지되는 경우 다시 시작하면 마지막 위치부터 다시 읽혀집니다. 제출된 데이터가 더 커지고 제출된 데이터 크기 제한을 초과할 수 있습니다. 위 내용은 이 글의 전체 내용입니다. 모든 분들께 도움이 되기를 바랍니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트를 주목해 주세요.

관련 권장 사항:

PHP가 zlib 확장을 사용하여 GZIP 압축 출력을 구현하는 방법에 대한 자세한 설명


PHP가 분산 Memcache를 구현하여 웹 클러스터 세션 동기화를 설정하는 방법에 대한 자세한 설명


mongoDB 데이터베이스 작업 완료 PHP로 구현된 클래스 예제 설명


위 내용은 PHP는 nginx 로그 파일을 정기적으로 모니터링하는 기능을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.