>  기사  >  백엔드 개발  >  Python의 로깅 모듈 분석(코드 예)

Python의 로깅 모듈 분석(코드 예)

不言
不言앞으로
2018-11-26 16:29:332422검색

이 기사의 내용은 Python의 로깅 모듈 분석(코드 예제)에 관한 것입니다. 특정 참고 가치가 있으므로 도움이 필요한 친구에게 도움이 되길 바랍니다.

1. 로깅 수준

  1. debug: 우선 순위 10, 디버깅 세부 정보 기록, 디버깅 중에만 활성화됨

  2. info: 우선 순위 20, 일반 메시지 기록, 오류 보고 및 경고 대기.

  3. 경고: 우선순위 30, 관련 경고 정보를 기록합니다.

  4. error: 우선순위 40, 오류 정보 및 프로그램 충돌 기록

  5. tical: 우선순위 50, 오류 정보 기록

설정하지 않으면 기본값은 iwarning입니다

2. 로깅 모듈의 주요 구조

로깅의 소스코드를 보면 기능을 구현하는 4가지 주요 클래스가 있음을 알 수 있습니다.

  1. Loggers: 관련 구성 설정 등 프로그램에서 직접 사용할 수 있는 인터페이스를 제공합니다.

  2. Handlers: Transmits 로거가 생성한 로그를 지정된 위치로 설정합니다.

  3. 필터: 출력 로그를 필터링합니다.

  4. 포맷: 로그의 출력 형식을 제어합니다.

Formatters

Formatters 개체는 로그의 출력 형식을 정의하며 많은 선택적 매개 변수가 있습니다.

매개변수 의미
%(name)s 로거 이름
%(levellno)s 숫자 형식의 로그 수준
%(레벨 이름)s 텍스트 형식의 로그 수준
%(pathname)s 로그 출력 기능을 호출하는 모듈의 전체 경로 이름,
%(filename)s 모듈의 파일이 없을 수 있음 로그 출력 함수를 호출하는 이름
%(module)s 로그 출력 함수를 호출하는 모듈 이름
%(funcName)s 로그 출력 함수를 호출하는 함수 이름
%(lineno)d 로그 호출 출력 함수의 명령문이 위치한 코드 라인
%(created)f 유닉스 표기법으로 부동 소수점 시간으로 표현한 현재 시간
%(relativeCreated)d 로그 정보 출력 시 Logger 이후 생성됩니다.
%(asctime)s 현재 시간을 문자열 형식으로, 기본 형식은 '2018'입니다. -11-22 16:49:45,896', 쉼표 뒤에는 밀리초
%(thread)d 스레드 ID가 있으며
%(threadName)s 스레드 이름이 없을 수 있습니다.
%(process)d Process ID가 있고
%(message) s 사용자가 출력한 정보

예:

import logging

#fmt:定义输出的日志信息的格式
#datefmt:定义时间信息的格式,默认为:%Y-%m-%d %H:%M:%S
#style:定义格式化输出的占位符,默认是%(name)格式,可选{}或$格式
formatter=logging.Formatter(fmt='%(asctime)s    %(levelname)s:  %(message)s'
                            ,datefmt='%Y-%m-%d %H:%M:%S',style='%')

핸들러 로그 프로세서

로그 프로세서는 파일로 출력하든 표준 출력으로 출력하든 관계없이 로그의 특정 흐름 방향을 처리하는 데 사용됩니다. 포맷터를 설정하여 출력 형식을 제어합니다. 로그를 필터링하는 필터를 추가합니다.

일반적으로 사용되는 두 가지 프로세서가 있습니다

  1. StreamHandler: 로그를 콘솔에 인쇄하는 데 사용됨

  2. FileHandler: 로그를 로그 파일로 인쇄하는 데 사용됨

기타 프로세서

이름 상세 위치설명RotatingHandlerlogging.handlers.RotatingHandler로그 롤백 방법, 최대 로그 파일 수 및 로그 파일 롤백 지원TimeRotatingHandler logging.TimeRotatingHandler로그 롤백 방법, 특정 시간 범위 내에서 로그 파일을 롤백SocketHandlerlogging.handlers.SocketHandler원격으로 로그를 TCP/IP 소켓으로 출력DatagramHandlerlogging.DatagramHandler UDP 소켓에 원격으로 로그 출력SMTPHandlerlogging.handlers.SMTPHandler원격으로 로그를 이메일 주소로 출력SysLogHandlerlogging.handlers.SysLogHandler syslog에 로그 출력 NTEventLogHandlerlogging.handlers.NTEventLogHandlerWindows NT/2000/xp의 이벤트 로그에 원격으로 출력MemoryHandlerlogging.handlers.MemoryHandler메모리의 지정된 버퍼에 로그 출력 HT TPHandlerlogging.handlers.HTTPHandler"GET" 또는 "POST"를 통해 원격으로 HTTP 서버로 출력
from logging import Handler

#所有日志处理器的父类
handler=Handler()

print('处理日志的等级:',handler.level)
print('处理日志的名字:',handler.name)
print('处理器的日志过滤器::',handler.filters)
print('日志的格式::',handler.filters)

#一些常用方法:
handler.get_name()
handler.set_name('')
handler.createLock()#创建线程锁
handler.acquire()#获取线程锁
handler.release()#释放线程锁
handler.setLevel('info') #设置日志处理器的记录级别
handler.setFormatter(fmt='')#设置日志的输出格式
handler.addFilter('')#往处理器中添加过滤器
handler.removeFilter('')#往处理器中移除过滤器
handler.emit('')#日志记录的处理逻辑,由子类实现

Logger 로그 객체

Logger는 모든 로깅 방법을 관리합니다.

from logging import error, debug, warning, info, fatal, critical, getLogger

#返回一个Logger实例
#以'root'为名字的日志对象在Logger对象中只有一个实例
logger=getLogger('root')

print('获取根日志对象',logger.root)
print('获取manager',logger.manager)
print('获取根日志对象的名字',logger.name)
print('获取根日志对象记录水平',logger.level)
print('获取根日志对象过滤器列表',logger.filters)
print('获取根日志对象处理器列表',logger.handlers)
print('获取根日志对象',logger.disabled)

#设置日志记录水平
logger.setLevel('info')

#输出日志信息,格式化输出
logger.info('this is %s','info',exc_info=1)
#记录warning信息
logger.warning('')
#记录error信息
logger.error('')
#等价于logger.error('',exc_info=1)
logger.exception('')
#记录debug信息
logger.debug('')
#记录critical信息
logger.critical('')
#直接指定级别
logger.log('info','')

#添加处理器
logger.addHandler()
#移除处理器
logger.removeHandler()
#判是否有处理器
logger.hasHandlers()

3. 로거의 기본 사용

예:

import logging
import sys

def my_get_logger(appname):
    #获取logger实例,如果参数为空则返回root logger
    logger=logging.getLogger(appname)
    #创建日志输出格式
    formatter=logging.Formatter('%(asctime)s    %(levelname)s:  %(message)s')

    #指定输出的文件路径
    file_handler=logging.FileHandler('test.log')
    # 设置文件处理器,加载处理器格式
    file_handler.setFormatter(formatter)

    #控制台日志
    console_handler=logging.StreamHandler(sys.stdout)
    console_handler.formatter=formatter

    #为logger添加的日志处理器
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)

    #指定日志的最低输出级别,默认为warn级别
    logger.setLevel(logging.INFO)
    return logger

if __name__ == '__main__':
    logger=my_get_logger('test')
    logger.debug('this is debug info')
    logger.info('this is information')
    logger.warning('this is warning message')
    logger.error('this is error message')
    logger.fatal('this is fatal message,it is same ad logger.critical')
    logger.critical('this is critical message')
결과:

2018-11-22 16:31:34,023 INFO: this is information
2018-11-22 16:31:34,023 WARNING: this is warning message
2018-11-22 16:31:34,023 ERROR: this is error message
2018-11-22 16:31:34,024 CRITICAL: this is fatal message,it is same ad logger.critical
2018-11-22 16:31:34,024 CRITICAL: this is critical message

4. 로거 로깅의 논리 호출 프로세스

  1. logger.debug 및 기타 메서드를 호출하여 로그를 기록합니다.

  2. 먼저 이 레코드의 로그 수준이 설정된 수준보다 큰지 확인합니다. 그렇지 않으면 직접 전달하고 더 이상 실행하지 않습니다.
  3. 로그 정보를 사용하여 LogRecord 로깅 개체를 매개변수로 생성합니다.
  4. 필터 로거 필터를 통한 LogRecord 개체, 필터링된 경우 통과
  5. 로그 레코드 개체는 핸들러 프로세서의 필터에 의해 필터링됩니다
  6. 이 레코드의 로그 수준이 핸들러에서 설정한 수준보다 큰지 여부를 판단합니다. 그렇지 않은 경우 직접 전달하고 더 이상 실행하지 않습니다.
  7. 마지막으로 프로세서의 내보내기 메서드를 호출하여 로그 기록을 처리합니다.
5. 로거 구성

    주로 getLogger 메소드를 통하지만 수정이 쉽지 않습니다
  1. basicConfig 메소드를 통해 달성했는데, 속도는 빠르지만 계층구조가 충분하지 않습니다
  2. logging.config.fileConfig(filepath)를 통해 파일 구성
  3. py3.2 버전에서 도입된 dictConfig의 사전 방식을 통해 구성됩니다. 새로운 구성 방식
파일 구성을 사용하세요

#logging.cong

[loggers]
#定义日志的对象名称是什么,注意必须定义root,否则报错
keys=root,main

[handlers]
#定义处理器的名字是什么,可以有多个,用逗号隔开
keys=consoleHandler

[formatters]
#定义输出格式对象的名字,可以有多个,用逗号隔开
keys=simpleFormatter

[logger_root]
#配置root对象的日志记录级别和使用的处理器
level=INFO
handlers=consoleHandler

[logger_main]
#配置main对象的日志记录级别和使用的处理器,qualname值得就是日志对象的名字
level=INFO
handlers=consoleHandler
qualname=main
#logger对象把日志传递给所有相关的handler的时候,会逐级向上寻找这个logger和它所有的父logger的全部handler,
#propagate=1表示会继续向上搜寻;
#propagate=0表示停止搜寻,这个参数涉及重复打印的坑。
propagate=0

[handler_consoleHandler]
#配置处理器consoleHandler
class=StreamHandler
level=WARNING
formatter=simpleFormatter
args=(sys,)

[formatter_simpleFormatter]
#配置输出格式过滤器simpleFormatter
format=%(asctime)-%(name)s-%(levelname)s-%(message)s
참고: 로거와 핸들러 모두 로그 수준을 설정할 수 있으며, 로그 출력은 가장 높은 수준을 취합니다.

사전 양식 구성 사용

사전 양식 구성이 더욱 강력하고 유연해졌습니다. dictConfig 기능을 통해 다른 형식의 구성 파일을 json, YAML 등과 같은 사전으로 변환할 수 있습니다.

예:

import yaml
from logging.config import dictConfig
import os
filename=os.path.dirname(os.path.abspath(__file__))
with  open(filename+'/logging.yaml','r') as f:
    log=yaml.load(f.read())
    dictConfig(log)
#logging.yaml
#注意:yaml格式严格,:后面一定要带空格
version: 1
formatters:
    simple:
          format: '%(asctime)s-%(name)s-%(levelname)s-%(message)s'
handlers:
    console:
          class: logging.StreamHandler
          level: DEBUG
          formatter: simple
          stream: ext://sys.stdout
    console_err:
          class: logging.StreamHandler
          level: DEBUG
          formatter: simple
          stream: ext://sys.stderr
loggers:
    simpleExample:
          level: DEBUG
          handlers: [console]
          propagate: no
root:
    level: DEBUG
    handlers: [console_err]]

6. 로거 구성 변경 듣기

logging.config.listen(port) 함수를 사용하면 영어 프로그램이 소켓의 새 구성 정보를 모니터링하여 애플리케이션을 다시 시작하지 않고도 런타임에 구성을 변경할 수 있습니다. 프로그램. 으르르르르

위 내용은 Python의 로깅 모듈 분석(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제