티스토리 뷰

Python(파이썬)

Python - logging 모듈 , 두번째

브라이언77 2022. 12. 24. 06:30
반응형

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 을 이용해서 필요한 값을 확인 할 수 있도록 프로그램을 작성해보자. 


궁금한 사항은 아래 댓글로 남겨주세요.

끝. 

댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함