Pythonic 로그 가이드
로그 기록의 실천 범위는 매우 간단한 정적 문자열 문장부터 풍부한 구조화된 데이터 이벤트까지 다양하다.본고에서, 우리는 Python에서 로그인하여 응용 프로그램에서 발생하는 일을 어떻게 더 잘 이해할 수 있는지 탐색할 것입니다.또한 로그에서 가장 큰 가치를 얻을 수 있도록 최선의 실천을 모색하겠습니다.
print ('왜 print 문구를 사용하지 않습니까?'
많은 Python 강좌들이 디버깅 도구로
print
을 사용하는 방법을 독자들에게 보여 주었다.다음은 print
을 사용하여 예외를 스크립트로 인쇄한 예입니다.>>> import sys
>>>
>>> def captureException():
... return sys.exc_info()
...
>>> try:
... 1/0
... except:
... print(captureException())
...
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero',), <traceback object at 0x101acb1c8>)
None
비록 이것은 비교적 작은 스크립트에서 매우 유용하지만, 응용 프로그램과 조작 수요가 증가함에 따라
print
은 그다지 실행할 수 없게 되었다.이것은 전체 출력 문장 종류를 닫는 유연성을 제공하지 않으며, stdout
까지만 출력할 수 있습니다.디버깅을 도울 수 있는 정보, 예를 들어 생성된 줄 번호와 시간도 누락되었다.print
이 가장 간단한 방법이지만, 설정할 필요가 없기 때문에, 곧 돌아와서 너를 물어뜯을 것이다.프린터 패키지를 stdout
에 직접 보내는 것도 좋지 않다. 왜냐하면 사용자가 메시지를 제어하는 능력을 삭제하기 때문이다.로그인 중입니다.메시지("Hello World to Logging")
로그 모듈은 Python 표준 라이브러리의 일부로 2.3 버전부터 사용됩니다.행 번호와 시간 스탬프와 같은 컨텍스트가 로그에 자동으로 추가됩니다.이 모듈은 네임스페이스 로그 기록과 심각도 수준을 쉽게 추가하여 출력의 위치와 내용을 더욱 잘 제어할 수 있습니다.
나는 무엇을 배우는 가장 좋은 방법은 하는 것이라고 믿기 때문에, 나는 네가 Python REPL을 따르도록 격려한다.로그 모듈을 사용하기 시작하는 것은 매우 간단합니다. 당신이 해야 할 일은 다음과 같습니다.
>>> import logging
>>> logging.basicConfig()
>>> logger = logging.getLogger(__name__)
>>>
>>> logger.critical('logging is easier than I was expecting')
CRITICAL:__main__:logging is easier than I was expecting
방금 무슨 일이 있었습니까?getLogger
은 우리에게 기록기의 실례를 제공했다.그리고 우리는 critical
의 등급으로 이벤트 "로그 기록이 내가 예상한 것보다 쉽다."수평
Python 모듈에서는 이벤트의 심각도 수준에 따라 이벤트를 구분할 수 있습니다.레벨은 0에서 50 사이의 정수를 나타냅니다.이 모듈은 전체 스펙트럼에 다섯 개의 상수를 정의하여 메시지를 구분하기 편리하다.
모든 등급은 부가적인 의미가 있기 때문에 로그인 중인 등급을 비판적으로 생각해야 합니다.
>>> logger.critical("this better be bad")
CRITICAL:root:this better be bad
>>> logger.error("more serious problem")
ERROR:root:more serious problem
>>> logger.warning("an unexpected event")
WARNING:root:an unexpected event
>>> logger.info("show user flow through program")
>>> logger.debug("used to track variables when coding")
info
및 debug
에는 인쇄 메시지가 없습니다.기본적으로 레코더는 warning
, error
또는 critical
메시지만 인쇄합니다.더 자세한 로그 기록을 동적으로 활성화하기 위해 실행할 때 수정할 수도 있습니다.>>> # should show up; info is a higher level than debug
>>> logger.setLevel(logging.DEBUG)
>>> logger.info(1)
INFO:root:1
>>>
>>> # shouldn't show up; info is a lower level than warning
... logger.setLevel(logging.WARNING)
>>> logger.info(2)
서식 적용 로그
기본 포맷 프로그램은 포맷 로그에 중요한 정보를 포함하지 않기 때문에 쓸모가 없습니다.로그 모듈은 형식을 바꾸어 로그에 쉽게 추가할 수 있습니다.
시간, 수준 및 메시지를 표시하도록 형식을 설정합니다.
>>> import logging
>>> logFormatter = '%(asctime)s - %(levelname)s - %(message)s'
>>> logging.basicConfig(format=logFormatter, level=logging.DEBUG)
>>> logger = logging.getLogger(__name__)
>>> logger.info("test")
2018-06-19 17:42:38,134 - INFO - test
그 중 일부 데이터(예를 들어 time
과 levelname
)는 자동으로 포착할 수 있지만, extra
의 상하문을 로그로 전송할 수도 있습니다.컨텍스트 추가
일반적인 로그 메시지가 제공하는 정보는 로그 메시지가 없는 것처럼 거의 적다.만약 당신이 일지를 훑어보지 않으면
removed from cart
을 볼 수 있다고 상상해 보세요.이것은 우리로 하여금 이런 질문에 대답하기 어렵게 한다. 물품은 언제 제거되었습니까?누가 그것을 가져갔습니까?그들은 무엇을 삭제했습니까?구조화된 데이터를 로그에 추가하는 것이 좋습니다. 대상을 문자열화하여 풍부하게 하는 것이 아닙니다.만약 구조화된 데이터가 없다면, 장래에 로그 흐름을 해독하기가 매우 어려울 것이다.이 문제를 처리하는 가장 좋은 방법은 중요한 메타데이터를
extra
대상으로 보내는 것이다.이 기능을 사용하면 흐르는 메시지를 풍부하게 할 수 있습니다.>>> import logging
>>> logFormatter = '%(asctime)s - %(user)s - %(levelname)s - %(message)s'
>>> logging.basicConfig(format=logFormatter, level=logging.DEBUG)
>>> logger = logging.getLogger(__name__)
>>> logger.info('purchase completed', extra={'user': 'Sid Panjwani'})
2018-06-19 17:44:10,276 - Sid Panjwani - INFO - purchase completed
공연
로그 기록은 사용자가 작성한 소프트웨어의 성능 요구와 균형을 이루는 비용을 도입합니다.비록 지출은 통상적으로 무시할 수 있지만, 불량한 방법과 잘못은 초래할 수 있다.
다음은 유용한 팁입니다.
등급 검사에서 비싼 통화를 포장하다
Python Logging Documentation은 평가를 지연시키기 위해 비싼 호출을 등급 검사에 봉인하는 것을 권장합니다.
if logger.isEnabledFor(logging.INFO):
logger.debug('%s', expensive_func())
현재 로그 기록 수준이 expensive_func
보다 크거나 같을 때만 INFO
을 호출할 수 있습니다.핫 경로 로그인 방지
열 경로는 성능에 매우 중요한 코드이기 때문에 자주 실행된다.기록해야 할 데이터가 열 경로 외에는 사용할 수 없기 때문에 IO 병목이 될 수 있으므로 로그 기록을 피하는 것이 좋습니다.
로그 저장 및 액세스
이제 너는 이 일지들을 쓰는 것을 배웠으니, 그것을 어떻게 처리해야 할지 결정해야 한다.기본적으로 로그는 표준 출력 장치(터미널 창일 수도 있음)에 기록되지만, Python의 로그 모듈은 출력 처리를 정의하는 다양한 옵션을 제공합니다.로그를 표준 출력에 기록하는 것을 권장합니다. Heroku, Amazon Elastic Beanstalk, Docker 등 플랫폼은 표준 출력을 포획하고 플랫폼 수준의 다른 로그 기록 시설로 재정립하여 이 표준을 구축합니다.
파일에 기록
로깅 모듈은 로깅을 로컬에 기록하여 장기간 보존할 수 있도록 프로세싱 프로그램을 쉽게 사용할 수 있습니다.
>>> import logging
>>> logger = logging.getLogger(__name__)
>>>
>>> handler = logging.FileHandler('myLogs.log')
>>> handler.setLevel(logging.INFO)
>>>
>>> logger.addHandler(handler)
>>> logger.info('You can find this written in myLogs.log')
만약 계속 추적하고 있다면, 로그가 info
레벨이기 때문에 파일에 표시되지 않을 것입니다.setLevel
을 사용하여 변경해야 합니다.현재
grep
을 사용하면 로그 파일을 쉽게 검색할 수 있습니다.grep critical myLogs.log
이제 키워드 (예: critical
또는 warning
) 를 포함하는 메시지를 검색할 수 있습니다.회전원목
Python 로그 기록 모듈은 일정 시간 간격이나 로그 파일이 일정한 크기에 이르면 다른 파일에 쉽게 로그인할 수 있습니다.오래된 로그를 자동으로 삭제하거나 날짜별로 로그를 검색하려면 방대한 파일을 검색해서 그룹화된 로그를 찾을 필요가 없기 때문에 매우 유용합니다.
매일 새 로그 파일을 생성하고 5일 이상 로그의
handler
을 자동으로 삭제하려면 TimedRotatingFileHandler
을 사용할 수 있습니다.예:logger = logging.getLogger('Rotating Log by Day')
# writes to pathToLog
# creates a new file every day because `when="d"` and `interval=1`
# automatically deletes logs more than 5 days old because `backupCount=5`
handler = TimedRotatingFileHandler(pathToLog, when="d", interval=1, backupCount=5)
결점
응용 프로그램을 관찰할 때 로그의 위치를 이해하는 것이 중요하다.나는 독자들에게 3 pillars of observability원칙을 보라고 건의한다. 왜냐하면 로그는 응용 프로그램을 관찰할 때 사용하는 소수의 도구 중의 하나이기 때문이다.로그는 관찰 가능한 창고의 구성 요소이지만, 도량은 추적과 같다.
벌목은 특히 규모가 비싸질 수도 있다.지표는 모든 작업을 추적할 필요 없이 데이터를 수집하고 고객의 질문에 대답하는 데 사용될 수 있으며, 추적을 통해 전체 플랫폼에서 요청한 경로를 볼 수 있습니다.
끝내다
만약 네가 이 글에서 무엇을 가져갔다면, 그것은 로그가 사용자 행위의 진실한 출처가 되어야 한다는 것이다.짧은 작업, 예를 들어 항목을 카트에 넣거나 카트에서 꺼내는 경우에도 오류 보고서를 얻기 위해 사용자의 절차를 추적할 수 있어야 하며, 로그를 통해 작업을 확인할 수 있습니다.
Python 로깅 모듈은 이를 쉽게 해줍니다.이것은 로그를 포맷하고 등급을 사용하여 동적 구분 메시지를 사용하며 프로세서를 사용하여 로그를 외부로 보낼 수 있습니다.사용자 조작을 이해하는 유일한 메커니즘은 아니지만 원시 이벤트 데이터를 포착하고 미지의 질문에 대답하는 효과적인 방법이다.
우리는 스스로 이 일을 하지 않고 매우 좋은 서비스 here @ Timber을 제공했다. 이것은 로그의 상하문을 자동으로 포착하여 디버깅을 간소화할 수 있다.우리를 무료로 시용하기;너는 심지어 신용카드도 필요 없어!
클라우드에 로그인
로그를 위탁 관리하는 로그 집합 서비스는 당신의 생활을 크게 간소화할 수 있기 때문에 중요한 일에 시간을 집중할 수 있습니다.
면책 성명: 저는 Timber의 현직 직원입니다.이 부분은 완전히 선택할 수 있지만, 나는 클라우드에 로그인하면 당신의 생활이 더욱 수월해질 것이라고 진심으로 믿는다.
pip install timber
import logging
import timber
logger = logging.getLogger(__name__)
timber_handler = timber.TimberHandler(api_key='...')
logger.addHandler(timber_handler)
그렇습니다.API 키를 timber.io에서 가져오기만 하면 로그를 볼 수 있습니다.우리는 자동으로 로그 모듈에서 그것들을 포획하기 때문에 당신은 계속 최선의 실천을 따르고 정상적으로 기록할 수 있으며, 동시에 우리는 빈틈없이 상하문을 추가할 수 있습니다.참고: Flask에서 응용 프로그램을 만들면 logging documentation을 보는 것이 좋습니다.
Reference
이 문제에 관하여(Pythonic 로그 가이드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/timber/the-pythonic-guide-to-logging-4p35텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)