'qualname설정'에 해당되는 글 1건

  1. 2022.03.10 [Python] logging.config 구성, log file encoding 설정
Programming Language/Python2022. 3. 10. 22:25
728x90

handler에서 encoding을 설정하는데, 각 handler의 아큐먼트(args) 위치에서 encoding 자리에서 설정합니다.

주의할 점은, 테스트 Python 버전은 3.9인데, config파일에 한글(2바이트)문자가 있으면 오류가 발생함.

버전 3.10에는 fileConfig의 아규먼트에 encoding가 추가되었습니다.

 

추가적인 handler의 args 양식은 아래 자료를 참조하세요. 

 

참조자료

 - loggin.config  : https://docs.python.org/ko/3/library/logging.config.html#module-logging.config

 - loggin.handlers:   https://docs.python.org/ko/3/library/logging.handlers.html

 

import logging.config

logging.config.fileConfig('../logging.conf')
logger = logging.getLogger(__name__)

logger.info("테스트 입니다.")

 

내용추가. (2022-03-17)

qualname 설정과 패키지에 대해서

 - 시스템의 패키지가 java처럼 하나로 묶이지 않으면, Log가 일부에서 출력되지 않는 문제가 발생함. Class는 정상적으로 나오는데,  Class가 없는 Util에서 로그가 출력 되지 않음. qualname을 모듈의 package가 다르니(예: util / api / data), 로그하나로 qualname설정으로 비Class 로그는 출력이 되지 않음. 테스트 해보면, 앞 패키지로 제어되는 건 확인됨.

그래서, util / api / data를 JAVA 처럼 sample/util, sample/api, sample/data 로 변경하면, 전체 로그가 출력됨.

 

package를 sample.main / sample.util / sample.api 이렇게 구조를 잡아야 전체를 제어할 수 있다.
qualname=sample 로 설정하면, 모든 로그를 출력할 있다.
logging.config.fileConfig('logging.conf') <-- main 에서 한 번만 호출하면 된다.
logger = logging.getLogger(__name__)  <-- 각 모듈에서 한 번만 호출한다.

 

 

logging.conf 파일 내용입니다.

[loggers]
keys=root, infoLogger

[handlers]
keys=consoleHandler, fileHandler

[formatters]
keys=consoleFormatter, fileFormatter

####################
## logger
####################
[logger_root]
# level=NOTSET
# handlers=
level=DEBUG
handlers=consoleHandler

[logger_infoLogger]
level=DEBUG
handlers=consoleHandler, fileHandler
# package를 sample.main / sample.util / sample.api 이렇게 구조를 잡아야 전체를 제어할 수 있다.
# qualname=sample 로 설정하면, 모든 로그를 출력할 있다.
# logging.config.fileConfig('logging.conf') <-- main 에서 한 번만 호출하면 된다.
# logger = logging.getLogger(__name__)      <-- 각 모듈에서 한 번만 호출한다.
qualname=sample
propagate=0

####################
## handler
####################
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=consoleFormatter
args=(sys.stdout,)

[handler_fileHandler]
class=FileHandler
formatter=fileFormatter
# FileHandler(filename, mode='a', encoding=None, delay=False, errors=None)
args=('logfile.log','a','utf8')

####################
## formatter
####################
[formatter_consoleFormatter]
format=%(asctime)s %(name)s [%(levelname)-8s] %(message)s
datefmt=

[formatter_fileFormatter]
format=%(asctime)s %(name)s [%(levelname)-8s] %(message)s
datefmt=

아래는 TimedRotatingFileHandler 에서 args 설정.

[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
formatter=fileFormatter
# TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None, errors=None)
# when: 'midnight', 'W0'-'W6', D', 'H', 'M'
#    - W0 is monday
args=('logfile.log', 'midnight', 1, 0, 'utf8')
728x90
Posted by 하루y