database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
ㆍ자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
자유게시판 자유게시판 4787 게시물 읽기
 
No. 4787
MySQL 쿼리 로그 분석기(?)
작성자
헝그리찍세
작성일
2005-06-13 13:54
조회수
4,876

사용예

/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();
?>

[Top]
No.
제목
작성자
작성일
조회
4792데이터 쿼리문을 작성하라는데 모르겠어여.. ㅠㅠ 도와주세요 [1]
김중생
2005-06-16
4289
4791MySQL 탄생 10주년이네요. [5]
허정수
2005-06-15
5170
4789DSN 방문자 순위가 조금 하락했네요. [1]
허정수
2005-06-15
4906
4787MySQL 쿼리 로그 분석기(?)
헝그리찍세
2005-06-13
4876
4786참나... 답변달기가 싫어지네... [8]
이경환
2005-06-12
5095
4785DB이전 복구 좀 부탁드립니다(비용드림)
kst
2005-06-12
4699
4784거의 다되간다... [1]
헝그리찍세
2005-06-10
4346
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.025초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다