OZ1NG의 뽀나블(Pwnable)

[Tips] Python logging + traceback 모듈을 이용한 에러 내용 저장 본문

Tips

[Tips] Python logging + traceback 모듈을 이용한 에러 내용 저장

OZ1NG 2021. 3. 31. 00:16

[*] python개발할때 멀티 프로세싱 또는 멀티 스레딩으로 개발해서 subprocess나 pthread 모듈을 사용할 경우

테스트 도중 에러가 발생하면 프로그램이 그대로 종료되어버려 log를 확인하기 어려운 경우가 생긴다.

 

이때 python에서 기본적으로 제공하는 logging모듈과 traceback 모듈 + try: except:를 이용하면

에러 로그를 파일로 저장하여 프로그램이 종료되더라도 확인 할 수 있다.

 

[*] 예제 코드

import logging
import traceback

logging.basicConfig(filename='./test.log', level=logging.ERROR)

def main():
    print("TEST")
    test() // ERROR!!

if __name__ == '__main__':
    try:
        main()
    except:
        logging.error(traceback.format_exc())

 

[+] 

logging.basicConfig(filename='./filename.log', level=logging.ERROR)

logging.basicConfig에 filename 인자를 넣어주면 해당 파일에 ERROR 레벨 이상의 로그를 저장하게 된다.

 

[+]

if __name__ == '__main__':
    try:
        main()
    except:
        logging.error(traceback.format_exc())

try: except: 구문으로 에러가 발생했을시 logging.error함수가 실행되도록 해주고 인자로

traceback.format_exc()를 넣어주면 에러가 발생했을 때의 함수 실행 흐름을 저장해준다.

 

[실행 결과]

[사진1] - 실행결과
[사진2] - 로그 파일 내용

[!] 주의사항

- 일반 syntax error는 안된다. (그냥 해당 프로그램에 바로 뜸.)

- log파일에 내용은 append옵션으로 저장이 된다. (덮어쓰기 x, 추가 o)

- 만약 logging.basicConfig에 filename 인자를 안넣어준다면 그냥 내용을 출력한다.

- 만약 파이썬 스크립트를 스레드로 실행하여 사용하는 경우에는 저장이 안된다.

  (그냥 에러 메세지 출력)

 

Comments