블로그 이미지
초딩입맛제주아재
하고 싶은 것만 하며 살고 싶다

calendar

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
2006. 8. 21. 21:02 Programing/아뜰리에

이번에 국제전화카드 쇼핑몰 프로젝트를 끝내고
로그파일을 하루 종일 지켜보고 있어야 하는 상황에서
출근하자마자 그날의 로그파일을 새로 tail -f 로 모니터링 해야했다.
그일이 불편하여 자동으로 새로운 로그파일을 모니터링 할 스크립트를 만들어봤다.

사용법 :
우선 해당 소스를 실행 모드로 설정 : chmod 777 LogViewer
LogViewer 실행
끝~

코드를 보자.
tail -f 를 직접 구현하고자 하니 여간 어려운게 아니었다.
쉬워보여서 뛰어든건데 -_-
하지만 막상 구현이 끝나니...
이게 뭐야 -_-;;;

아무튼 소스는 주석의 내용만으로 충분히 이해가 갈듯하다.

#!/usr/local/php5/bin/php -q
<?php
/**
* FILE_NAME : LogViewer
* AUTHOR    : asrada2001@hotmail.com
* DATE      : 2006-08-21
* DESC      : 로그파일 자동 뷰어
               - 일별 또는 월별 등 날짜로 명명되어진 로그파일을 보여준다.
               - 날짜 변경시 자동으로 다음 로그파일을 보여준다.
* LICENSE   :
**/

$filehead = 'logfile head';     //로그파일구성 = 헤드(유무) + 날짜(항목은 상황에 맞게 설정)
$basic_readline = 5;
$current_file = Null;
$firstopen = true;

while(true){

  $filetail   = date('Ymd');
  $filename   = $filehead.$filetail;

  if($current_file != $filename){
       echo "===============================================================\n";
       echo "##  New LogFile Watching -- ".$filetail."\n";
       echo "===============================================================\n";

       $current_file = $filename;
       $last_pos = Null;
       $firstopen = true;
  }

  if(file_exists($filename) == true){

       if(filesize($filename) == 0){
           continue;
       }

       $readline   = 0;
       $first_pos  = Null;
       $result     = Null;

       $fp = fopen($filename,'r');

       $pos       = -2;                //파일의 마지막 문자가 \n 이므로 -2 부터 시작
       $char      = Null;

       while(fseek($fp,$pos,SEEK_END) == 0){
           $char = fgetc($fp);

           if($char == "\n" || $char == "\r"){
               $str = fgets($fp);
               $this_pos = ftell($fp);

               if($this_pos == false){
                   break;
               }

               $readline++;

               //열려진 파일의 최초 검색된 new line(\n) 의 포인터 위치를 저장하여
               //다음번 로딩시에 이 포인터 이전의 내용은 검색을 제한한다.
               if($first_pos == Null){
                   $first_pos = $this_pos;
               }

               //이전 파일의 마지막 포인터의 위치
               //현재 포인터가 이전 파일의 마지막 포인터와 같은 값을 갖을때 검색을 중지한다.
               if($last_pos == $this_pos){
                   break;
               }

               //출력되어질 로그파일의 내용
               $result = $str.$result;

               //최초 파일 오픈할때는 마지막 5라인 출력
               if($firstopen == true){
                   //echo "============= first_line cashing....".$readline." ========================\n";

                   if($readline == $basic_readline){
                       $firstopen = false;
                       $readline = 0;
                       break;
                   }
               }else{
                   if($last_pos == Null){
                       break;
                   }else{
                       if($this_pos <= $last_pos){
                           break;
                       }
                   }
               }
           }

           $pos--;
       }

       $last_pos = $first_pos;

       if($result != Null){
           echo $result;
       }

       fclose($fp);
       unset($fp);

       sleep(1);

  }
  else{
       echo $filename." << file not found...\n";
       sleep(10);
  }
}
?>

필요에 의한 개발...
필요라는 동기가 무척이나 중요한것 같다.
만약 이번 프로젝트가 없었다면
언제 이런걸 만들어볼까~~~

posted by 초딩입맛제주아재