이번에 국제전화카드 쇼핑몰 프로젝트를 끝내고
로그파일을 하루 종일 지켜보고 있어야 하는 상황에서
출근하자마자 그날의 로그파일을 새로 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);
}
}
?>
필요에 의한 개발...
필요라는 동기가 무척이나 중요한것 같다.
만약 이번 프로젝트가 없었다면
언제 이런걸 만들어볼까~~~
'Programing > 아뜰리에' 카테고리의 다른 글
디렉토리별 디스크 사용량을 확인하는 du의 활용 (0) | 2007.03.05 |
---|---|
Drag가 가능한 메모보드 (26) | 2007.01.26 |
파일 확장자 바꾸는 스크립트 (1) | 2006.12.12 |
XmlHttpRequest를 사용한 일정관리 (0) | 2006.11.10 |