[python] 아무것도 출력하지 않는 Python 로깅

내가 쓰는 파이썬 스크립트에서 로깅 모듈을 사용하여 이벤트를 기록하려고합니다. 로거를 구성하려면 다음 코드가 있습니다.

ERROR_FORMAT = "%(levelname)s at %(asctime)s in %(funcName)s in %(filename) at line %(lineno)d: %(message)s"
DEBUG_FORMAT = "%(lineno)d in %(filename)s at %(asctime)s: %(message)s"
LOG_CONFIG = {'version':1,
              'formatters':{'error':{'format':ERROR_FORMAT},
                            'debug':{'format':DEBUG_FORMAT}},
              'handlers':{'console':{'class':'logging.StreamHandler',
                                     'formatter':'debug',
                                     'level':logging.DEBUG},
                          'file':{'class':'logging.FileHandler',
                                  'filename':'/usr/local/logs/DatabaseUpdate.log',
                                  'formatter':'error',
                                  'level':logging.ERROR}},
              'root':{'handlers':('console', 'file')}}
logging.config.dictConfig(LOG_CONFIG)

을 실행하려고 할 때 문서의이 페이지에 루트 로거가 메시지를 출력해야 한다고 말 logging.debug("Some string")하더라도 콘솔에 출력이 표시되지 않습니다. 내 프로그램이 아무 것도 출력하지 않는 이유는 무엇이며 어떻게 수정할 수 있습니까?logging.debug



답변

기본 로깅 수준은 경고입니다. 레벨을 변경하지 않았으므로 루트 로거의 레벨은 여전히 ​​경고입니다. 즉, 디버그 로깅을 포함하여 경고보다 낮은 수준의 로깅은 무시됩니다.

이것은 튜토리얼에 설명되어 있습니다 .

import logging
logging.warning('Watch out!') # will print a message to the console
logging.info('I told you so') # will not print anything

레벨이 정보보다 높기 때문에 ‘info’라인은 아무것도 인쇄하지 않습니다.

레벨을 변경하려면 루트 로거에서 설정하십시오.

'root':{'handlers':('console', 'file'), 'level':'DEBUG'}

즉, level = DEBUG로 핸들러를 정의하는 것으로는 충분하지 않습니다. 실제 로깅 레벨도 DEBUG가되어야 출력 할 수 있습니다.


답변

수년이 지난 후에도 여전히 Python 로거에 사용성 문제가있는 것 같습니다. 다음은 예제와 함께 몇 가지 설명입니다.

import logging
# This sets the root logger to write to stdout (your console).
# Your script/app needs to call this somewhere at least once.
logging.basicConfig()

# By default the root logger is set to WARNING and all loggers you define
# inherit that value. Here we set the root logger to NOTSET. This logging
# level is automatically inherited by all existing and new sub-loggers
# that do not set a less verbose level.
logging.root.setLevel(logging.NOTSET)

# The following line sets the root logger level as well.
# It's equivalent to both previous statements combined:
logging.basicConfig(level=logging.NOTSET)


# You can either share the `logger` object between all your files or the
# name handle (here `my-app`) and call `logging.getLogger` with it.
# The result is the same.
handle = "my-app"
logger1 = logging.getLogger(handle)
logger2 = logging.getLogger(handle)
# logger1 and logger2 point to the same object:
# (logger1 is logger2) == True


# Convenient methods in order of verbosity from highest to lowest
logger.debug("this will get printed")
logger.info("this will get printed")
logger.warning("this will get printed")
logger.error("this will get printed")
logger.critical("this will get printed")


# In large applications where you would like more control over the logging,
# create sub-loggers from your main application logger.
component_logger = logger.getChild("component-a")
component_logger.info("this will get printed with the prefix `my-app.component-a`")

# If you wish to control the logging levels, you can set the level anywhere 
# in the hierarchy:
#
# - root
#   - my-app
#     - component-a
#

# Example for development:
logger.setLevel(logging.DEBUG)

# If that prints too much, enable debug printing only for your component:
component_logger.setLevel(logging.DEBUG)


# For production you rather want:
logger.setLevel(logging.WARNING)

일반적인 혼동의 원인은 잘못 초기화 된 루트 로거에서 비롯됩니다. 이걸 고려하세요:

import logging
log = logging.getLogger("myapp")
log.warning("woot")
logging.basicConfig()
log.warning("woot")

산출:

woot
WARNING:myapp:woot

런타임 환경 및 로깅 수준에 따라 첫 번째 로그 줄 (기본 구성 이전)이 어디에도 표시되지 않을 수 있습니다 .


답변

여기에 아주 간단한 대답을 원하는 사람이라면 표시 할 수준을 설정하기 만하면됩니다. 내 모든 스크립트의 맨 위에 방금 넣었습니다.

import logging
logging.basicConfig(level = logging.INFO)

그런 다음 해당 수준 이상을 표시하려면 :

logging.info("Hi you just set your fleeb to level plumbus")

로그가 사용자가 설정 한 수준 이상으로 표시되도록 5 개 수준의 계층 적 집합입니다 . 따라서 오류를 표시하려면 logging.error("The plumbus is broken").

심각도의 순서를 증가의 수준이다 DEBUG, INFO, WARNING, ERROR,와 CRITICAL. 기본 설정은 WARNING입니다.

이것은 내 대답보다 더 잘 표현 된이 정보를 포함하는 좋은 기사입니다 :
https://www.digitalocean.com/community/tutorials/how-to-use-logging-in-python-3


답변

시도해 볼까요? 제 경우에는 모든 핸들러를 제거한 후 문제가 해결 된 것 같습니다.

for handler in logging.root.handlers[:]:
    logging.root.removeHandler(handler)

logging.basicConfig(filename='output.log', level=logging.INFO)


답변