티스토리 뷰
Python - Logging 모듈, 두번째 이야기
이번 포스팅에서는 python logging 을 커스터마이징하는 방법에 대해서 작성할 예정이다.
이전 포스팅에서 작성한 파이썬의 기본 로그를 만들어보자.
import logging
logging.basicConfig(filename='myTest.log',
format='%(asctime)s - %(name)s - %(levelname)s -%(message)s',
level=logging.DEBUG)
logging.info("This is an INFO message")
< myTest.log >
2022-12-24 08:18:43,656 - root - INFO -This is an INFO message
1. 하나의 파일에 여려개의 로거 생성
파이썬에서는 기본적으로 제공하는 logging 모듈을 이용해서 새로운 logger 객체를 만들어서 사용할 수 있다. 이렇게 하면 하나의 logging 이 아닌 여러개의 logger 를 이용해서 별로의 로그를 작성할 수 있는 것이다. 로거(logger)를 생성하는 방법은 다음과 같다.
import logging
logging.basicConfig(filename='myTest.log',
format='%(asctime)s - %(name)s - %(levelname)s -%(message)s',
level=logging.DEBUG)
logger = logging.getLogger("my_logger")
logger.info("This is an INFO message")
< myTest.log >
2022-12-24 08:18:43,656 - root - INFO -This is an INFO message
2022-12-24 08:24:33,357 - my_logger - INFO -This is an INFO message
다시 로그를 확인해 보면 이전에 생성한 로그와 동일한 형태로 로그가 생성된 것을 확인 할 수 있다. 한가지 다른 것은 logger 에 대한 이름이 "my_logger" 로 변경된 것이다. 이처럼 로거를 생성하게되면 basicConfig 에 대한 설정을 그대로 사용하고 있다는 것을 알수 있다.
새로 생성한 my_logger 에 대한 설정을 변경해 보자. 로거는 handler 와 formatter 객체를 가지고 있는데, handler 는 message 에 대한 관리를 담당하고, formatter 는 로그 형식에 대한 정의를 한다.
import logging
logging.basicConfig(filename='myTest.log',
format='%(asctime)s - %(name)s - %(levelname)s -%(message)s',
level=logging.DEBUG)
logger = logging.getLogger("my_logger")
handler = logging.FileHandler('my_logger.log')
formatter = logging.Formatter('%(asctime)s::%(name)s::[%(levelname)s] - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info("This is an INFO message")
< my_logger.log >
2022-12-24 09:25:42,929::my_logger::[INFO] - This is an INFO message
< myTest.log >
2022-12-24 08:18:43,656 - root - INFO -This is an INFO message
2022-12-24 08:24:33,357 - my_logger - INFO -This is an INFO message
my_logger 에 handler 와 formatter 를 추가하고 실행시켜보면, my_logger.log 에 새로운 형식의 로그가 추가되고 myTest.log 에는 변경 사항이 없는 것을 볼 수 있다.
2. 여러개의 모듈에서 logging 모듈에 대한 설정
하나의 프로그램을 실행하기 위해서는 다수의 python 모듈을 import 해서 실행하게 된다. 이렇게 여러개의 module 에서 logging 을 설정하고 로그를 남기면 어떻게 되는지 확인해 보자.
이번 예제는 두개의 파일을 만들고 각 파일에서 logging.basicConfig() 를 설정한다.
<main.py>
import logging
import helper
logging.basicConfig(
filename="myapp.log",
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s -%(message)s',
)
logging.info('This is logs from main.py module')
<helper.py>
import logging
logging.basicConfig(
filename="myHelper.log",
level=logging.DEBUG,
format='%(asctime)s :: %(name)s :: %(levelname)s :: %(message)s',
)
logging.info('Do something in Helper.py')
두개의 python 파일을 생성하고 main.py 에서 helper.py 파일을 호출하고 로그만 남기는 프로그램이다. main.py 를 실행해보자.
<myapp.log>
.
<myHelper.log>
2022-12-24 15:49:22,475 :: root :: INFO :: Do something in Helper.py
2022-12-24 15:49:22,475 :: root :: INFO :: This is logs from main.py module
결과를 보면, myapp.log 에는 아무런 로그가 남지 않고, myHelper.log 에만 기록된 것을 확인할 수 있다. 예상대로라면 main.py의 로그는 myapp.log 에 남고, helper.py 의 로그는 myHelper.log 에 남았어야 한다. 실제 결과는 myHelper.log 에만 로그가 남겨졌다.
이는 python logging 의 basicConfig() 는 단 한번만 실행되길 때문이다. main.py에서 import helper 를 수행하는 순간에 basicConfig() 가 실행되고 프로그램에 대한 logging 설정이 완료된 것이다. 프로그램이 종료될때가지 logging 에 대한 설정은 다음 값을 따르게된다.
logging.basicConfig(
filename="myHelper.log",
level=logging.DEBUG,
format='%(asctime)s :: %(name)s :: %(levelname)s :: %(message)s',
)
main.py 에서도 basicConfig()가 정의 되었지만, 이미 설정된 값이 있어서 무시된다. 그래서 main.py / helper.py 의 모든 로그는 myHelper.log 에 남겨지게된다.
3. 여러개의 파일에 개별 logger 생성
각각의 모듈에서 로그를 남기고 싶다면 별도의 로거를 생성해서 사용하면 된다.
<main.py>
import logging
import helper
logger = logging.getLogger("main.py")
handler = logging.FileHandler('main.log')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
logger.info('This is logs from main.py module')
<helper.py>
import logging
logger = logging.getLogger('myHelper')
handler = logging.FileHandler('myHelper.log')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)
print('log level: ', logger.getEffectiveLevel())
logger.info('Do something in Helper.py')
로그확인>
<main.log>
2022-12-24 16:38:13,910 - main.py - INFO -This is logs from main.py module
<myHelper.log>
2022-12-24 16:38:13,910 - myHelper - INFO -Do something in Helper.py
여기까지 python logging 을 이용해서 로그를 남기는 방법에 대해서 알아보았다. 이제 print() 를 사용해서 console 에 값을 확인하는 대신에 logging 을 이용해서 필요한 값을 확인 할 수 있도록 프로그램을 작성해보자.
궁금한 사항은 아래 댓글로 남겨주세요.
끝.
'Python(파이썬)' 카테고리의 다른 글
파이썬에서 숫자(Int) 를 문자열(String) 로 변환하기 (0) | 2023.05.16 |
---|---|
python 으로 나에게 카카오톡 메시지 보내기 (0) | 2023.03.01 |
Python - Logging 모듈, 첫번째 (0) | 2022.12.23 |
Django - Product 모델을 위한 view 와 templates 만들기 (0) | 2019.11.20 |
Django - Category 모델을 위한 view 와 template 만들기 (0) | 2019.11.20 |
- Total
- Today
- Yesterday
- 메시지 전송
- cmd실행
- df 명령어
- slack api
- win10
- 미밴드
- vscode
- Karabiner-Elements
- http 요청
- 팀 소통
- python slack
- angular
- cmd창
- win7
- END key
- 파이썬
- django
- 프로젝트 생성
- amaztools
- 디스크 사용량
- HOME key
- python message
- Python
- 장고
- channel oauth
- venv
- webhook
- HOME/END
- 미밴드4
- du 명령어
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |