2011년 3월 5일 토요일

[Python] logger로 syslog쓰기 삽질 실패기

처절한 제목이지만 일단 기록으로 남겨놓자. 서버의 로그를 남기기 위해 python의 logging를 사용하고 있었다. 이 녀석을 RotatingHandler를 통해 용량 제한으로 로테이팅으로 돌아가게 해 놨었는데 용량 제한이 제 멋대로 적용되는 문제가 발생했다.

결국 문제는 해결하지 못 했다. python 버전 상의 문제라고 생각하고 업그레이드는 주저하게 되고 그냥 포기하고 우회로 다른 방법을 생각해야 했다.

이 삽질기는 그걸 해결하기 위해 syslog를 사용하려는 시도에서 발생했다.

일단 logging 사용예에서 핸들러 생성 부분만 logging.handlers.SysLogHandler로 교체했다.

handler = logging.handlers.SysLogHandler(
    ('/dev/log', logging.handlers.SYSLOG_UDP_PORT),
    facility=logging.handler.SysLogHandler.LOG_LOCALx,)

LOG_LOCALx는 facility에 따라 결정할 부분이다. 서버 관리자와 함께 syslogd.conf를 적당히 수정해서 결정해야 되는 부분이니 설명은 생략.

하지만 이게 동작하지 않더라. 이유를 알아야 뭘 처리하던지 할 텐데 난감. 첫 번째 패러미터를 비워두면 기본적으로 /dev/log로 잡힌다고 하던데 이것도 안되고...

잠시를 고민하다 그냥 우회하기로 했다. Unix에선 python의 syslog 모듈을 이용할 수가 있으니까.

import syslog
syslog.openlog('apiserver', syslog.LOG_NOWAIT, syslog.LOG_LOCALx)


def debugSyslog(msg):
    syslog.syslog(syslog.LOG_DEBUG, msg)

facility는 openlog의 3번째 인자에서 결정이 가능하고, priority는 syslog시 설정할 수 있다. 이렇게 하니 로그가 찍히는 걸 확인할 수 있었다.

syslog의 스펙인건지 아니면 현재 서버상에서 설정된 것 때문에 그런지 모르겠지만, syslog를 통해서 로그를 남기면 newline이 전혀 먹히질 않더라. newline이 모조리 삭제되어서 찍히고 더구나 한 줄의 최대 제한도 있었다.

win32에선 syslog모듈이 없을 수도 있으니 import error에 대비해서 exception처리는 필요할 것이다. 일단 여기서는 생략.

어쨌건 이렇게 또 한건을... 항상 생각하는데, 난 문제가 발생하면 근본 원인을 해결하기 보다 우회해서 해결한 경우가 많은 것 같다. 고쳐야 될 문제인데. -_-

댓글 없음 :