사용예
/usr/local/storage/bin/php /svc1/jerry/query.php >
result.log
(소스 중간에 로그 파일 이름 변경이랑, 위에줄에 경로명이나
프로그램명 변경 해주시면됩니다.
### 다음 개발 시작이란 부분 살짝 수정해서 날짜, 시간,
순번(?)을뺀 나머지를 디비에 걍
무대뽀로 넣고 나중에 group by에 count 순으로 내림차순 정리하면
어떤 쿼리가 제일 많은지...)
문의나 버그 요청 사항은 : jerry.kim@yurion.com (헝그리 찍세)
<?
###############################################
# Database Server 로그를 파싱해 입력하는 루틴 #
###############################################
### 연속된 공백을 단일 공백으로 치환하는 함수 ###
function clean_space($f_buffer) {
for ($cnt = 0; $cnt < strlen($f_buffer); $cnt++) { # 문장의
글짜수를 체크해 글짜수 만큼 반복해 이중 공백 " "을 단일 공백 "
"으로 치환한다.
$f_buffer = str_replace(" ", " ", $f_buffer); # 더 좋은
알고리즘이나 정규표현식을 몰라 무식하게 처리함.
}
return ($f_buffer);
}
### 출력을 위한 함수 ###
function print_buffer($f_buffer) {
$scnt = 0; # 작은 따옴표를 카운트 하기 위한 변수
$offset = 0; # 다음에 올 작은 따움표의 위치를 기억할
변수
$scnt = substr_count($f_buffer, "'"); # 작은 따옴표의 숫자를
카운트 한다.
if ($scnt > 0) { #
for ($cnt = 0; $cnt < $scnt; $cnt+=2) {
$begin = strpos($f_buffer, "'", $offset); # 쌍으로 오는 첫번째
따옴표의 위치를 기억한다.
$end = strpos($f_buffer, "'", $begin + 1); # 쌍으로 오는 바로
다음에 오는 따옴표의 위치를 기억한다.
$f_buffer = str_replace(substr($f_buffer, $begin, $end - $begin
+ 1), "''", $f_buffer); # 쌍으로 오는 첫따옴표와 바로뒤에 따옴표
사이의 내용을 공백으로 치환
$offset = $begin + 2; # 다음번 반복문 수행시 바로 위에서
치환된 따옴표 뒷에부터 시작할 위치를 설정함
}
}
### 다음 개발 시작 : 데이터베이스에 넣는 루틴이나 필터링 추가
예정 ###
if (substr_count($f_buffer, " ") > 0) { # 연속된 공백이
있는지 검사한다. (연속된 공백 제거를 위해)
echo strtoupper(clean_space($f_buffer)) . "\n"; # 연속된 공백이
있는 경우 공백을 제거후 출력한다.
}
else echo strtoupper($f_buffer) . "\n"; # 연속된 공백이 없는
경우 그냥 출력한다.
### 다음 개발 종료 ###
return;
}
### 프로그램 메인 함수 ###
function Program_main() {
$o_buffer = ""; # 출력용 버퍼 선언
# 로그 파일을 파싱하는 루틴
$handle = fopen("./query.log", "r"); # 여기에 분석할 로그
파일를 입력하면 된다.
while (!feof($handle)) {
$buffer = trim(fgets($handle)); # 앞뒤 불필요한 공백
제거
$buffer = str_replace(chr("09"), " ", $buffer); # 탭을 공백으로
치환
$buffer = clean_space($buffer); # 다중 공백을 단일 공백으로
치환
$buffer = str_replace(" ,", ", ", $buffer); # 콤마의 위치를
보기 좋게 치환
### 시작 : 로그 날짜 (날짜와 시간 정보)를 추출하고 없을 경우
강제로 넣어준다. ###
$array = explode(" ", $buffer);
if (is_numeric($array[0]) and strlen($array[0]) == 6 and
strlen($array[1]) == 8 and is_numeric(str_replace(":", "",
$array[1]))) {
$v_date = $array[0]; # 로그의 날짜를 저장하는 변수
$v_time = $array[1]; # 로그의 시간을 저장하는 변수
}
else {
if (strlen($v_date) == 0 or strlen($v_time) == 0) {
$v_date = "000000"; # 정상적인 로그가 아닌 경우
강제적으로 날짜를 "000000"으로 셋팅 한다.
$v_time = "00:00:00"; # 정상적인 로그가 아닌 경우
강제적으로 시간을 "000000"으로 셋팅 한다.
}
else {
array_unshift ($array, $v_date, $v_time); # 동일 시간의 경우
로그에 시간이 없기 때문에 시간을 강제로 넣어준다.
}
}
### 종료 : 로그 날짜 (날짜와 시간 정보)를 추출하고 없을 경우
강제로 넣어준다. ###
if ((is_numeric($array[2]) and strtoupper($array[3]) ==
"CONNECT") # 한줄짜리 로그인 경우의 조건
or (is_numeric($array[2]) and strtoupper($array[3]) ==
"QUIT")
or (is_numeric($array[2]) and strtoupper($array[3]) == "INIT"
and strtoupper($array[4]) == "DB")
or (is_numeric($array[2]) and strtoupper($array[3]) == "QUERY"
and strtoupper($array[4]) == "BEGIN")
or (is_numeric($array[2]) and strtoupper($array[3]) == "QUERY"
and strtoupper($array[4]) == "COMMIT")
or (strtoupper($array[3]) == "QUERY" and strtoupper($array[4])
== "SET")
or (strtoupper($array[3]) == "QUERY" and strtoupper($array[4])
== "ROLLBACK")
or (strtoupper($array[3]) == "QUERY" and strtoupper($array[4])
== "SHOW")
) {
### 시작 : 새로운 질의(?)인지 체크해 버퍼를 지우는 루틴 ###
if (strlen($o_buffer) > 0) print_buffer ($o_buffer); #
버퍼에 완료(출력)되지 않은 내용이 있으면 출력해 준다.
$o_buffer = ""; # 버퍼를 비워준다.
$o_buffer = implode(" ", $array) . " "; # 버퍼에 배열의
내용을 공백을 준후 다시 정리한다.
print_buffer ($o_buffer); # 버퍼에 내용을
출력한다.
$o_buffer = ""; # 버퍼를 비워준다.
### 종료 : 새로운 질의인지 체크해 버퍼를 지우는 루틴 ###
}
else if ((strtoupper($array[3]) == "QUERY" and
strtoupper($array[4]) == "SELECT") # 여러줄짜리 로그인 경우의
조건
or (strtoupper($array[3]) == "QUERY" and strtoupper($array[4])
== "UPDATE")
or (strtoupper($array[3]) == "QUERY" and strtoupper($array[4])
== "DELETE")
or (strtoupper($array[3]) == "QUERY" and strtoupper($array[4])
== "INSERT")
or (strtoupper($array[3]) == "PREPARE" and
strtoupper($array[4]) == "SELECT")
){
if (strlen($o_buffer) > 0) print_buffer ($o_buffer);
$o_buffer = ""; # 버퍼를 비워준다.
$o_buffer = implode(" ", $array) . " "; # 버퍼에 배열의 내용을
공백을 준후 다시 정리한다.
}
else { # 여러줄짜리 로그의 내용줄 다음줄로 넘어간 경우의
조건
array_shift($array); # 위에서 강제로 넣어준 날짜를
제거한다.
array_shift($array); # 위에서 강제로 넣어준 시간을
제거한다.
$o_buffer = $o_buffer . implode(" ", $array) . " "; # 버퍼에
배열의 내용을 공백을 준후 다시 정리한다.
}
}
fclose($handle);
}
Program_main();
?>
|