사용자가 다양한 형식으로 로그를 저장하여 프로그램 디버깅을 돕거나 프로그램 실행 중 출력 정보를 기록할 수 있는 로깅 인터페이스와 다양한 처리 모듈을 제공합니다.
로깅 로그 수준은 5가지 수준으로 나뉘며, 우선순위는 높음부터 낮음입니다.
**CRITICAL; ** 심각한 프로그램 오류
**ERROR;
**WARNING; **프로그램에 오류가 있을 수 있습니다**INFO; **프로그램이 정상적으로 실행될 때의 정보DEBUG 프로그램 디버깅 정보기본 로그 기록 레벨은 WARNING입니다. WARNING보다 크거나 같은 경우에만 기록됩니다. 일반적으로 사용되는 녹음 레벨은 INFO이며, 이는 프로그램의 정상적인 작동에 대한 일부 정보를 기록하는 데 사용됩니다(인쇄와 유사). 로그 수준이 WARNING 이상에 도달하면 현재로서는 프로그램을 정상적으로 실행할 수 없음을 나타냅니다. 로거의 기본 기능logging.basicConfig(**kwargs)
import logging logging.debug('Debug code!') logging.info('Run code!') logging.warning('Watch out!') logging.error('This is an error') logging.critical('This is a ciritical')위 코드에서 로깅은 로거(logging.getLogger)를 명시적으로 생성하지 않습니다. debug(), info(), warning(), error(), important(를 사용할 때 기본값을 사용합니다. ) 루트 로거를 직접 호출하고 사용자 정의 또는 기본 login.basicConfig(**kwargs)를 자동으로 호출하여 루트 로거를 초기화합니다. 사용자 정의 로깅.basicConfig(**kwargs)의 매개 변수에는 다음과 같은 주요 옵션이 있습니다.
Function | |
---|---|
로그를 저장할 파일 이름을 지정하고, 지정된 파일을 사용합니다. name FileHandler를 생성하면 기록된 로그가 파일에 저장됩니다 | |
출력 형식과 내용을 지정합니다. 기본값은 레벨 이름, 이름 및 메시지가 콜론으로 구분됩니다 | |
지정된 날짜 사용 / time.strftime()에서 허용하는 것과 동일한 시간 형식입니다. | |
루트 로거 수준을 지정하세요. 기본값은 로깅입니다.WARNING | |
로그의 출력 스트림을 지정하세요. 출력을 sys.stderr, std.stdout 또는 파일로 지정할 수 있습니다. 기본 출력은 sys .stderr입니다. 지정된 스트림을 사용하여 StramHandler를 초기화합니다. 참고: 스트림과 파일 이름 매개변수가 동시에 사용되면 ValueError가 발생합니다. 예를 들어, log.basicConfig(**kwargs)를 사용자 정의하면 초기화됩니다. DEBUG 레벨 이상의 로그 기록을 얻어서 log.txt 파일에 저장합니다. | import logging logging.basicConfig(filename='./log.txt', format='%(asctime)s-%(name)s-%(levelname)s-%(message)s-%(funcName)s:%(lineno)d', level=logging.DEBUG) logging.debug('Debug code!') logging.info('Run code!') logging.warning('Watch out!') logging.error('This is an error') logging.critical('This is a ciritical') | 로깅의 네 가지 주요 구성 요소(클래스)
루트 로거(루트 로거) 외에도 가장 중요한 것은 자신만의 로거를 만들 수 있다는 것입니다.
logging.getLogger(name)
를 통해 로거를 인스턴스화합니다. 기본적으로 로거는 계층 구조를 채택하며 다양한 수준은 로 구분됩니다. . 예를 들어
foo
라는 로거가 있는 경우 foo.a
와 foo.b
는 모두 foo
의 하위 항목입니다. 코드> 레벨 레코더. 물론 첫 번째 또는 최상위 수준 로거는 루트 로거입니다. name=None이면 루트 로거가 빌드됩니다.
현재 모듈의 이름을 로거 이름 logging.getLogger(__name__)
으로 바로 사용할 수 있습니다.
하위 수준 로거는 일반적으로 로그 수준과 핸들러를 별도로 설정할 필요가 없습니다. 하위 수준 로거에 If가 개별적으로 설정되어 있지 않으면 해당 동작이 상위 로거에 위임됩니다. 예를 들어, foo
로거에는 INFO 수준이 있지만 foo.a
나 foo.b
에는 로그 수준이 설정되어 있지 않습니다. 이때 foo.a
와 foo.b
는 foo
의 레벨 설정을 따릅니다. 즉, 다음보다 높은 레벨의 로그만 기록합니다. 또는 INFO와 동일하면 기록되며, foo가 설정되지 않은 경우 루트 로거가 발견됩니다. 기본 루트 레벨은 WARGING입니다. logging.getLogger(name)
实例化记录器
默认情况下,记录器采用层级结构,通过 .
来区分不同的层级。比如 有个名叫 foo
的记录器 则 foo.a
和 foo.b
都是 foo
的子级记录器。当然,最开始的或者说最上层的记录器就是 root logger。如果 name=None,构建的是root logger。
可以直接用当前模块的名称当作记录器的名字 logging.getLogger(__name__)
子级记录器通常不需要单独设置日志级别以及 Handler,如果子级记录器没有单独设置,则它的行为会委托给父级。比如说,记录器foo
的级别为INFO,而foo.a
和 foo.b
都不设置日志级别。此时foo.a
和 foo.b
会遵循foo
함수 설명 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
로거(Logger)가 처리할 로그 메시지 레벨 설정 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
핸들러 객체 추가 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
핸들러 객체 제거 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
필터 객체 추가 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
필터 객체 제거 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DEBUG 수준 로깅 설정 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
INFO 수준 로깅 설정 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
경고 설정 레벨 logging | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ERROR 수준 로깅 설정 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CRITICAL 수준 로깅 설정 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
출력 스택 추적 정보 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
로그 기록을 생성하려면 사용자 정의 수준 매개변수를 설정하세요 |
Handler.setFormatter() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Handler.addFilter () | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Handler.removeFilter() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging.StramHandler() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging.FilterHandler() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RotationFileHandler() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
TimeRotatingFileHandler() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging.handers.HTTPHandler() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging.handlers.SMTPHandler() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Filter filter组件用来过滤 logger 对象,一个 filter 可以直接添加到 logger对象上,也可以添加到 handler 对象上,而如果在logger和handler中都设置了filter,则日志是先通过logger的filter,再通过handler的filter。由于所有的信息都可以经过filter,所以filter不仅可以过滤信息,还可以增加信息。 Filter 类的实例化对象可以通过 logging.Filter(name) 来创建,其中name 为 记录器的名字,如果没有创建过该名字的记录器,就不会输出任何日志: filter = logging.Filter("foo.a") 基本过滤器类只允许低于指定的日志记录器层级结构中低于特定层级的事件,例如 这个用 Filter 类 有 三个方法 :
Formatter 格式化日志的输出;实例化: 其中 fmt 参数 有以下选项:
例如: formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s') # -表示右对齐 8表示取8位 handler.formatter = formatter datefmt 参数 有以下选项:
例如: formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s') # -表示右对齐 8表示取8位 handler.formatter = formatter datefmt 参数 有以下选项:
例子: formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s","%Y%m%d-%H:%M:%S") handler.formatter = formatter logging 的配置
在 loguser.conf 中 写入相关的信息 [loggers] keys=root,fileLogger,rotatingFileLogger [handlers] keys=consoleHandler,fileHandler,rotatingFileHandler [formatters] keys=simpleFormatter [logger_root] level=INFO handlers=consoleHandler [logger_fileLogger] level=INFO handlers=fileHandler qualname=fileLogger propagate=0 [logger_rotatingFileLogger] level=INFO handlers=consoleHandler,rotatingFileHandler qualname=rotatingFileLogger propagate=0 [handler_consoleHandler] class=StreamHandler level=INFO formatter=simpleFormatter args=(sys.stdout,) [handler_fileHandler] class=FileHandler level=INFO formatter=simpleFormatter args=("logs/fileHandler_test.log", "a") [handler_rotatingFileHandler] class=handlers.RotatingFileHandler level=WARNING formatter=simpleFormatter args=("logs/rotatingFileHandler.log", "a", 10*1024*1024, 50) [formatter_simpleFormatter] format=%(asctime)s - %(module)s - %(levelname)s -%(thread)d : %(message)s datefmt=%Y-%m-%d %H:%M:%S
from logging import config with open('./loguser.conf', 'r', encoding='utf-8') as f: ## 加载配置 config.fileConfig(f) ## 创建同名Logger,其按照配置文件的handle,formatter,filter方法初始化 logger = logging.getLogger(name="fileLogger")
在 loguser.yaml文件 中 配置相关信息 version: 1 disable_existing_loggers: False # formatters配置了日志输出时的样式 # formatters定义了一组formatID,有不同的格式; formatters: brief: format: "%(asctime)s - %(message)s" simple: format: "%(asctime)s - [%(name)s] - [%(levelname)s] :%(levelno)s: %(message)s" datefmt: '%F %T' # handlers配置了需要处理的日志信息,logging模块的handler只有streamhandler和filehandler handlers: console: class : logging.StreamHandler formatter: brief level : DEBUG stream : ext://sys.stdout info_file_handler: class : logging.FileHandler formatter: simple level: ERROR filename: ./logs/debug_test.log error_file_handler: class: logging.handlers.RotatingFileHandler level: ERROR formatter: simple filename: ./logs/errors.log maxBytes: 10485760 # 10MB #1024*1024*10 backupCount: 50 encoding: utf8 loggers: #fileLogger, 就是在代码中通过logger = logging.getLogger("fileLogger")来获得该类型的logger my_testyaml: level: DEBUG handlers: [console, info_file_handler,error_file_handler] # root为默认情况下的输出配置, 当logging.getLogger("fileLoggername")里面的fileLoggername没有传值的时候, # 就是用的这个默认的root,如logging.getLogger(__name__)或logging.getLogger() root: level: DEBUG handlers: [console] 同样的可以通过导入 yaml 文件加载配置 with open('./loguser.yaml', 'r', encoding='utf-8') as f: yaml_config = yaml.load(stream=f, Loader=yaml.FullLoader) config.dictConfig(config=yaml_config) root = logging.getLogger() # 子记录器的名字与配置文件中loggers字段内的保持一致 # loggers: # my_testyaml: # level: DEBUG # handlers: [console, info_file_handler,error_file_handler] my_testyaml = logging.getLogger("my_testyaml") logging 和 print 的区别看起来logging要比print复杂多了,那么为什么推荐在项目中使用 logging 记录日志而不是使用print 输出程序信息呢。 相比与print logging 具有以下优点:
|
위 내용은 Python의 내장 로깅을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!