본문 바로가기
Python/Python FAQ

Python 파일에 로그를 기록하고 표준 출력에 출력하기 위한 로거 설정, logger configuration to log to file and print to stdout

by 베타코드 2023. 9. 9.
반응형

질문


I'm using Python's logging module to log some debug strings to a file which works pretty well. Now in addition, I'd like to use this module to also print the strings out to stdout. How do I do this? In order to log my strings to a file I use following code:

import logging
import logging.handlers
logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)
handler = logging.handlers.RotatingFileHandler(
    LOGFILE, maxBytes=(1048576*5), backupCount=7
)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)

and then call a logger function like

logger.debug("I am written to the file")

Thank you for some help here!


답변


루트 로거에 대한 핸들을 얻고 StreamHandler를 추가하십시오. StreamHandler는 stderr에 작성합니다. stdout 대신 stderr을 사용해야 하는지 확실하지 않지만, Python 로거를 설정할 때 사용하는 방법이며 FileHandler도 추가합니다. 그러면 모든 로그가 두 곳으로 전송됩니다(원하는 대로 들립니다).

import logging
logging.getLogger().addHandler(logging.StreamHandler())

stderr 대신 stdout로 출력하려면 StreamHandler 생성자에 지정하기만 하면 됩니다.

import sys
# ...
logging.getLogger().addHandler(logging.StreamHandler(sys.stdout))

공통 헤더를 가진 모든 로그 라인에 Formatter를 추가할 수도 있습니다.

예:

import logging
logFormatter = logging.Formatter("%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s")
rootLogger = logging.getLogger()

fileHandler = logging.FileHandler("{0}/{1}.log".format(logPath, fileName))
fileHandler.setFormatter(logFormatter)
rootLogger.addHandler(fileHandler)

consoleHandler = logging.StreamHandler()
consoleHandler.setFormatter(logFormatter)
rootLogger.addHandler(consoleHandler)

다음과 같은 형식으로 출력됩니다:

2012-12-05 16:58:26,618 [MainThread  ] [INFO ]  my message
반응형

댓글