Python Language
벌채 반출
수색…
파이썬 로깅 소개
이 모듈은 응용 프로그램 및 라이브러리에 대한 유연한 이벤트 로깅 시스템을 구현하는 함수 및 클래스를 정의합니다.
표준 라이브러리 모듈에서 제공하는 로깅 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