수색…


파이썬 로깅 소개

이 모듈은 응용 프로그램 및 라이브러리에 대한 유연한 이벤트 로깅 시스템을 구현하는 함수 및 클래스를 정의합니다.

표준 라이브러리 모듈에서 제공하는 로깅 API의 주요 이점은 모든 Python 모듈이 로깅에 참여할 수 있으므로 응용 프로그램 로그에 타사 모듈의 메시지와 통합 된 고유 메시지가 포함될 수 있다는 것입니다.

그래서, 시작하자 :

코드의 예제 구성

import logging

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
        '%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.debug('this is a %s test', 'debug')

출력 예 :

2016-07-26 18:53:55,332 root         DEBUG    this is a debug test

INI 파일을 통한 구성 예제

파일 이름이 logging_config.ini라고 가정합니다. 파일 형식에 대한 자세한 내용은 로깅 자습서로깅 구성 섹션을 참조하십시오.

[loggers]
keys=root

[handlers]
keys=stream_handler

[formatters]
keys=formatter

[logger_root]
level=DEBUG
handlers=stream_handler

[handler_stream_handler]
class=StreamHandler
level=DEBUG
formatter=formatter
args=(sys.stderr,)

[formatter_formatter]
format=%(asctime)s %(name)-12s %(levelname)-8s %(message)s

그런 다음 코드에서 logging.config.fileConfig() 를 사용하십시오.

import logging
from logging.config import fileConfig

fileConfig('logging_config.ini')
logger = logging.getLogger()
logger.debug('often makes a very good meal of %s', 'visiting tourists')

사전을 통한 구성 예제

Python 2.7부터는 설정 세부 사항이있는 사전을 사용할 수 있습니다. PEP 391 은 구성 사전에 필수 요소와 선택적 요소의 목록을 포함합니다.

import logging
from logging.config import dictConfig

logging_config = dict(
    version = 1,
    formatters = {
        'f': {'format':
              '%(asctime)s %(name)-12s %(levelname)-8s %(message)s'}
        },
    handlers = {
        'h': {'class': 'logging.StreamHandler',
              'formatter': 'f',
              'level': logging.DEBUG}
        },
    root = {
        'handlers': ['h'],
        'level': logging.DEBUG,
        },
)

dictConfig(logging_config)

logger = logging.getLogger()
logger.debug('often makes a very good meal of %s', 'visiting tourists')

예외 로깅

예외를 기록하려면 logging.exception(msg) 메소드를 사용할 수 있고 사용해야합니다.

>>> import logging
>>> logging.basicConfig()
>>> try:
...     raise Exception('foo')
... except:
...     logging.exception('bar')
...
ERROR:root:bar
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
Exception: foo

인수를 예외로 전달하지 마십시오.

logging.exception(msg)msg arg을 기대하므로 다음과 같이 로깅 호출에 예외를 전달하는 것은 일반적인 함정입니다.

>>> try:
...     raise Exception('foo')
... except Exception as e:
...     logging.exception(e)
...
ERROR:root:foo
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
Exception: foo

이것이 처음에는 옳은 것처럼 보일지 모르지만 로깅 모듈에서 예외와 다양한 인코딩이 함께 작동하는 이유 때문에 실제로 문제가 있습니다.

>>> try:
...     raise Exception(u'föö')
... except Exception as e:
...     logging.exception(e)
...
Traceback (most recent call last):
  File "/.../python2.7/logging/__init__.py", line 861, in emit
    msg = self.format(record)
  File "/.../python2.7/logging/__init__.py", line 734, in format
    return fmt.format(record)
  File "/.../python2.7/logging/__init__.py", line 469, in format
    s = self._fmt % record.__dict__
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128)
Logged from file <stdin>, line 4

유니 코드 문자가 포함 된 예외를 기록하려고하면이 방법은 비참하게 실패합니다 . 그것은 당신의 logging.exception(e) 호출을 포맷하는 동안 발생 된 새로운 예외로 대체함으로써 원래 예외의 스택 추적을 숨길 것이다.

분명히, 자신의 코드에서 예외의 인코딩을 알고있을 수 있습니다. 그러나 제 3 자 라이브러리는 다른 방식으로이를 처리 할 수 ​​있습니다.

올바른 사용법 :

예외 대신 메시지를 전달하고 파이썬이 마술을하게한다면, 그것은 효과가 있습니다 :

>>> try:
...     raise Exception(u'föö')
... except Exception as e:
...     logging.exception('bar')
...
ERROR:root:bar
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
Exception: f\xf6\xf6

이 경우에 우리가 실제로 e 를 사용하지 않는다는 것을 알 수 있듯이, logging.exception(...) 의 호출은 마술처럼 가장 최근의 예외를 포맷합니다.

비 ERROR 로그 수준의 예외 로깅

ERROR가 아닌 다른 로그 레벨로 예외를 기록하려는 경우 기본 로거의 exc_info 인수를 사용할 수 있습니다.

logging.debug('exception occurred', exc_info=1)
logging.info('exception occurred', exc_info=1)
logging.warning('exception occurred', exc_info=1)

예외 메시지 액세스

라이브러리는 유니 코드 또는 (행운의 경우 utf-8) 바이트 문자열 중 하나로 메시지가있는 예외를 throw 할 수 있습니다. 예외의 텍스트에 실제로 액세스해야하는 경우 repr(e) 또는 %r 문자열 형식을 사용하면됩니다.

>>> try:
...     raise Exception(u'föö')
... except Exception as e:
...     logging.exception('received this exception: %r' % e)
...
ERROR:root:received this exception: Exception(u'f\xf6\xf6',)
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
Exception: f\xf6\xf6


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow