본문 바로가기
프로그램 (PHP,Python)

MySql 쿼리 디버깅을 위한 방법 - syslog

by 날으는물고기 2009. 4. 28.

MySql 쿼리 디버깅을 위한 방법 - syslog

PHP를 이용하여 웹 어플리케이션을 작성 할 때 난감한 이슈 중의 하나는 Database query를 찍어보는 것이다.

echo나 print로 로그를 찍게 되면, 화면에 직접 출력되기 때문에 만약 운영중인 웹 어플리케이션이라면 화면 가득 쏟아져 나온 쿼리를 보게 될 것이다.

단순하게 파라미터나 그 밖의 변수를 찍어 보는 정도라면 echo나 print가 적당할 수도 있겠지만, 쿼리를 찍는다는건 긴 스트링일 가능성이 크기 때문에 그리 추천할 만 한 방법은 아니다.

IBM 디벨로퍼웍스에서는 PHP 웹 어플리케이션 디버깅 시에 사용할 만한 좋은 기법으로 syslog()에 대한 아티클을 게재한 바 있다.

syslog로 PHP 프로그램 디버깅하기 (한글) [원문보기]

PHP에서 syslog 함수는 아래와 같이 정의되어 있다.

syslog - Generate a system log message
  Description
    bool syslog( int $priority, string $message )

시스템 로그 메세지를 생성해 주는 역할을 하는 함수가 바로 syslog() 이다. [PHP 도큐먼트 보기]

첫번째 인자로는 상수를 전달하면 되고, 두번째 인자로는 출력하고자 하는 메세지를 적어주면 된다.
(상수는 원문을 참고 해 주시라.)

예를 들면 이런 경우를 생각해 보자.

(상황)
1. 나는 현재 MySql 쿼리에 오작동이 의심되는 페이지를 열고 있다. 하지만, 사용자가 사용중이다.
2. MySql이 워낙 복잡하여, 일일히 찍으면서 디버깅을 하고 싶다.
3. 사용자에게 화면이 깨지거나, 엉뚱한 문자를 보여주기는 싫다.

(방안)
syslog를 사용해 본다.

$sql = "어렵게 구성되고 있는 MySql 쿼리문";
echo $sql;      -- [X] 화면에 쿼리가 왕창 찍힐 것이다.
syslog( LOG_INFO, "Query : ".$sql );      -- [O] 화면에는 아무것도 찍히지 않는다.

syslog에 첫번째 인자로 상수 LOG_INFO를 지정했다. LOG_INFO 정도라면 충분히 원하는 문자열을 찍을 수 있다.

syslog를 이용하여 찍었을 때, 로그 위치는 다음과 같다.

/var/log/messages
시스템 로그가 쌓이는 부분에 고스란히 쿼리를 찍어 주고 있을 것이다.


MySql 로그 설정으로 보다 다양하게 찍기

MySql을 설치하면 일반적으로 로그에 대한 설정은 따로 해주지 않는다. 이 때문에 로그를 syslog로 찍어야 하는 방법 밖에 없는, 또는 echo 정도로 로그를 찍어주는 것만 하고 있을지도 모른다.

MySql 설치시에 로그에 대한 설정을 자동으로 해준다면, 더할나위 없겠지만 아쉽게도 수동으로 주석을 풀어줘야 한다.

(순서)
1. /etc/my.cnf 파일을 연다.
2. 로그와 관련된 설정을 심어준다.
3. 저장 후에 MySql을 재시동 한다.

3번 항목 재시동이라는 부분이 마음에 걸리지만, 그래도 한번 적용으로 두고두고 득(得)이 된다.
설정법은 아래와 같다.

# 바이너리 로그 설정
    log-bin = bin_logs
# 쿼리 로그 설정
    log = query_logs
# 에러 로그 설정
    log-error = err_logs
# 느린 쿼리(slow query) 설정
    log-slow-queries = slow_logs
# Update 쿼리 설정
    log-update = update_logs

5가지의 로그 설정을 해 주면, 각 상황에 맞게 tail -f 파일명 을 이용하여 콘솔로 찍기만 하면 된다.
위에 설정에서 bin_logs, query_logs, err_logs, slow_logs, update_logs는 임의로 지정한 명칭이다. 상황에 맞게 적어주면 된다.

이렇게 지정된 로그의 위치는 mysql/data 폴더 안에 생성된다.
이 위치에서 보면 위에서 설정한 이름으로 파일들이 생성되었음을 확인 할 수 있다.


출처 : http://toriworks.tistory.com/
728x90

댓글