IT

logging.info 이 콘솔에 표시되지 않지만 경고 및 오류가 나타납니다.

itgroup 2023. 7. 17. 20:54
반응형

logging.info 이 콘솔에 표시되지 않지만 경고 및 오류가 나타납니다.

이벤트를 기록할 때logging.info파이썬 터미널에는 나타나지 않습니다.

import logging
logging.info('I am info')  # no output

이와 대조적으로 이벤트는 다음과 함께 기록됩니다.logging.warn터미널에 나타납니다.

import logging
logging.warn('I am warning')  # outputs "I am warning"

환경 수준을 변경할 수 있습니까?logging.info콘솔에 인쇄하시겠습니까?각 Python 파일의 변경을 피하고 싶습니다.

루트 로거는 항상 경고 수준으로 기본 설정됩니다.통화해봐

logging.getLogger().setLevel(logging.INFO)

그리고 당신은 괜찮을 겁니다

@ztyx가 말한 것처럼 기본 로거 레벨은 경고입니다.더 낮은 레벨로 설정해야 합니다.

logging.basicConfig를 사용하고 로거 레벨을 설정하여 이 작업을 수행할 수 있습니다.

logging.basicConfig(level=logging.DEBUG)

위의 해결책은 저에게 효과가 없었지만, 여기 코드는 다음과 같습니다.

# set up logging to file
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# add the handler to the root logger
logging.getLogger('').addHandler(console)

(가독성을 위해 코드의 일부를 생략했습니다.)

이것은 효과가 있을 것입니다.

import logging

logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

logger.info('its working')

최신 버전의 Python 3(Python 3.8로 테스트됨)에서는 콘솔 로깅을 사용하려면 콘솔 핸들러를 생성하여 올바르게 표시해야 합니다.info메시지입니다.

다음 예제는 Python 설명서의 로깅 구성 예제에서 수정되었습니다.

import logging

# create logger
logger = logging.getLogger('__name__')
level = logging.INFO
logger.setLevel(level)

# ----> console info messages require these lines <----
# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(level)

# add ch to logger
logger.addHandler(ch)
# -----------------------------------------------------

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

위의 코드를 실행하면 다음 출력이 생성됩니다.

info message
warn message
error message
critical message

콘솔 핸들러가 없는 동일한 코드가 있습니다.

import logging

# create logger
logger = logging.getLogger('__name__')
level = logging.INFO
logger.setLevel(level)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

콘솔 핸들러를 사용하지 않으면 출력에 다음 정보 메시지가 포함되지 않습니다.

warn message
error message
critical message

불필요한 것 같은데 왜 그런지 이해가 안 됩니다.

작동하는 모듈 레벨 로거에 필요한 최소 코드는 무엇입니까?저는 (파이썬 버전 3.8.6으로) 실험을 했습니다.

할인 혜택은 다음과 같습니다.

  • logging.basicConfig()필요합니다(단, 지정).level=...필요 없음)
  • 루트 로거를 구성해야 합니다.logging.getLogger().setLevel(...)

따라서 최소 작업 예제는 다음과 같습니다.

라이브러리/모듈 코드는 로거를 구성할 필요가 없습니다.

# library/module code: lib.py
import logging
LOGGER = logging.getLogger('x.y.z')

def some_function():
    LOGGER.info("hi")

애플리케이션 코드는 로거를 최소 2개의 라인으로 구성해야 합니다.

# Application Code
import logging, lib

logging.basicConfig()
logging.getLogger().setLevel(logging.INFO)  # configure root logger

main()  # code that will trigger lib

실험은 다음과 같습니다.

In [1]: import logging

In [2]: lg = logging.getLogger('x.y.z')

In [3]: lg.info(1)

In [4]: logging.basicConfig()

In [5]: lg.info(1)

In [6]: logging.basicConfig(level=logging.INFO)

In [7]: lg.info(1)

In [8]: logging.basicConfig()

In [9]: logging.getLogger().setLevel(logging.INFO)

In [10]: lg.info(1)
INFO:x.y.z:1

를 사용하는 사용자용absl.logging동등한 명령어는

from absl import logging
logging.set_verbosity(logging.INFO)

Django를 사용하여 서버에 전원을 공급하는 경우 settings.py 파일의 로그 수준을 다음과 같이 변경하기만 하면 됩니다.

"handlers": {
                "console": {
--                  "level": "WARNING",
++                  "level": "INFO",
                    "class": "logging.StreamHandler",
                    "formatter": "stackdriver",
                }
            },

여기 설명서의 더 많은 예: https://docs.djangoproject.com/en/4.0/topics/logging/ #configuring-discs-1

logging.info()로그에 루트 로거를 사용합니다.

공식 문서에 따르면, 만약 당신이 로거에 대해 명시적인 핸들러를 설정하지 않는다면, 특별한 핸들러는lastResort사용됩니다.여기 코드를 참조하십시오.기본적으로 로깅 수준:lastResort(스트림 핸들러입니다)는 30입니다. 출력 정보 메시지로 레벨을 변경할 수 있습니다.

# setting both the logger and handler's level will work as expected.
logger.setLevel(logging.DEBUG)
logging.lastResort.setLevel(logging.DEBUG)

그러나 이것은 해킹과 같아서 결코 권장되지 않는 행동입니다.

logging.basicConfig() 사용

만약 우리가 정말 빨리 로깅을 하고 싶다면, 우리는 그 방법을 사용할 수 있습니다.

logging.basicConfig(level=logging.DEBUG)

로거가 생성됩니다.logger.level은 여기서 설정한 수준이 됩니다.NOTSET 수준의 스트림 핸들러도 생성됩니다.수준 매개 변수가 없는 경우 루트 로거의 기본 수준은 WARNING입니다.

언급

언급URL : https://stackoverflow.com/questions/11548674/logging-info-doesnt-show-up-on-console-but-warn-and-error-do

반응형