>백엔드 개발 >파이썬 튜토리얼 >다중 프로세스 환경에서 Python의 로깅 모듈 사용에 대한 자세한 설명

다중 프로세스 환경에서 Python의 로깅 모듈 사용에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-02-14 13:51:081936검색

많은 애플리케이션에는 시스템 작동 상태를 쉽게 추적할 수 있도록 시스템 작동 중에 몇 가지 주요 정보를 기록하는 데 사용되는 로그 모듈이 있습니다. 이 글은 주로 다중 프로세스 환경에서 Python의 로깅 모듈을 사용하는 방법을 소개합니다. 필요한 친구들이 참고할 수 있습니다.

서문

모든 프로그래머는 Python을 사용하여 백그라운드 작업을 작성할 때 출력 로그를 사용하여 프로그램 실행 상태를 기록하고 오류가 발생하면 오류를 보고해야 하는 경우가 많다는 것을 알아야 한다고 생각합니다. 추가 디버깅 및 분석을 위해 세부 정보가 저장됩니다. Python의 로깅 모듈은 이러한 상황에서 훌륭한 도우미입니다.

로깅 모듈은 로그 수준 DEBUG, INFO, WARNING, ERROR, CRITICAL을 지정할 수 있습니다. 예를 들어 개발 및 디버깅 중에는 DEBUG 이상의 수준의 로그가 출력될 수 있지만 프로덕션 환경에서는 INFO만 출력됩니다. 수준으로 출력할 수 있습니다. (지정하지 않을 경우 기본 레벨은 경고)

logging 명령줄이나 파일에 출력을 지정할 수도 있고, 로그 파일을 시간이나 크기별로 분할할 수도 있습니다.

로깅의 자세한 사용에 대해서는 여기에서 자세히 설명하지 않겠습니다. 공식 문서나 여기에서 소개를 참조하세요.

로깅 구성

일반적으로 로그 파일이 너무 커지지 않도록 로그를 파일에 저장하고 자동으로 파일을 분할해야 합니다. 로깅 구성의 예는 다음과 같습니다.

import logging.config
 
logging.config.dictConfig({
 'version': 1,
 'disable_existing_loggers': True,
 'formatters': {
  'verbose': {
   'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
   'datefmt': "%Y-%m-%d %H:%M:%S"
  },
  'simple': {
   'format': '%(levelname)s %(message)s'
  },
 },
 'handlers': {
  'null': {
   'level': 'DEBUG',
   'class': 'logging.NullHandler',
  },
  'console': {
   'level': 'DEBUG',
   'class': 'logging.StreamHandler',
   'formatter': 'verbose'
  },
  'file': {
   'level': 'DEBUG',
   'class': 'logging.RotatingFileHandler',
   # 当达到10MB时分割日志
   'maxBytes': 1024 * 1024 * 10,
   # 最多保留50份文件
   'backupCount': 50,
   # If delay is true,
   # then file opening is deferred until the first call to emit().
   'delay': True,
   'filename': 'logs/mysite.log',
   'formatter': 'verbose'
  }
 },
 'loggers': {
  '': {
   'handlers': ['file'],
   'level': 'info',
  },
 }
})

이를 사용하여 모듈에 로그를 기록할 수 있습니다

import logging
logger = logging.getLogger(__name__)
 
if __name__ == '__main__':
 logger.info('log info')

사용 방법 다중 프로세스 환경

공식 문서에 따르면 로깅은 스레드로부터 안전합니다. 즉, 프로세스의 여러 스레드가 동시에 동일한 파일에 로그를 쓰는 것이 안전합니다. 그러나 (예, 그렇습니다.) 여러 프로세스가 동일한 파일에 로그를 쓰는 것은 안전하지 않습니다. 공식 진술은 다음과 같습니다.

Python에는 여러 프로세스에서 단일 파일에 대한 액세스를 직렬화하는 표준 방법이 없기 때문에 여러 프로세스에서 단일 파일에 로그인해야 하는 경우 이를 수행하는 한 가지 방법은 다음과 같습니다. 모든 프로세스를 SocketHandler에 기록하고 소켓에서 읽고 파일에 기록하는 소켓 서버를 구현하는 별도의 프로세스를 갖습니다. (원하는 경우 기존 프로세스 중 하나에 이 기능을 수행하는 전용 스레드를 지정할 수 있습니다. .)

어떤 사람들은 여러 프로세스가 필요하지 않다고 말할 것입니다. 그러나 Python에는 큰 GIL 잠금이 있습니다(GIL에 대한 논쟁은 여기에서 읽을 수 있습니다). 멀티 코어 CPU를 활용하기 위해 멀티 스레딩을 사용하는 것은 불가능합니다. 멀티 코어 CPU의 문제이므로 여러 프로세스에서 로그를 열지 못하는 문제는 여전히 해결되지 않습니다.

이 문제를 해결하기 위해 ConcurrentLogHandler를 사용할 수 있습니다. ConcurrentLogHandler는 다중 프로세스 환경에서 동일한 파일에 안전하게 로그를 작성할 수 있으며, 로그 파일이 특정 크기에 도달하면 로그 파일을 분할할 수 있습니다. 기본 로깅 모듈에는 로그 파일을 시간별로 분할할 수 있는 TimedRotatingFileHandler 클래스가 있습니다. 불행하게도 ConcurrentLogHandler는 로그 파일을 시간별로 분할하는 방법을 지원하지 않습니다.

핸들러의 클래스를 수정합니다.

logging.config.dictConfig({
 ...
 'handlers': {
  'file': {
   'level': 'DEBUG',
   # 如果没有使用并发的日志处理类,在多实例的情况下日志会出现缺失
   'class': 'cloghandler.ConcurrentRotatingFileHandler',
   # 当达到10MB时分割日志
   'maxBytes': 1024 * 1024 * 10,
   # 最多保留50份文件
   'backupCount': 50,
   # If delay is true,
   # then file opening is deferred until the first call to emit().
   'delay': True,
   'filename': 'logs/mysite.log',
   'formatter': 'verbose'
  }
 },
 ...
})

실행 후 자동으로 .lock 파일이 생성되는 것을 확인할 수 있으며, 잠금을 통해 안전하게 로그 파일을 작성할 수 있습니다.

다중 프로세스 환경에서 Python의 로깅 모듈 사용에 대한 자세한 설명은 PHP 중국어 웹사이트를 참고하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.