Logging

阅读量:

基本用法

import logging

logging.debug('Python debug')
logging.info('Python info')
logging.warning('Python warning')
logging.error('Python Error')
logging.critical('Python critical')

输出结果:

WARNING:root:Python warning
ERROR:root:Python Error
CRITICAL:root:Python critical

未进行实例化时,会默认创建名称为 rootlogger 实列,且默认输出严重于 warning 的记录。

日志等级

级别 级别数值 使用时机
DEBUG 10 详细信息,常用于调试。
INFO 20 程序正常运行过程中产生的一些信息。
WARNING 30 警告用户,虽然程序还在正常工作,但有可能发生错误。
ERROR 40 由于更严重的问题,程序已不能执行一些功能了。
CRITICAL 50 严重错误,程序已不能继续运行。

日志级别等级排序:critical > error > warning > info > debug

级别越高打印的日志越少,反之亦然,即

  • debug : 打印全部的日志 ( notset 等同于 debug )
  • info : 打印 info, warning, error, critical 级别的日志
  • warning : 打印 warning, error, critical 级别的日志
  • error : 打印 error, critical 级别的日志
  • critical : 打印 critical 级别
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

logging.setLevel(logging.DEBUG)

logging 模块不直接进行实例化,而是通过 logging.gerLogger() 函数进行实例化。多次调用 getLogger() 使用相同的名称时,会返回相同的 Logger 对象。

记录格式

logging.basicConfig(format="[%(asctime)s] [%(name)s] [%(levelname)s] [%(pathname)s:%(lineno)d] %(message)s")

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter("[%(asctime)s] [%(name)s] [%(levelname)s] [%(pathname)s:%(lineno)d] %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)

当实例化 logging 时,通过添加 handlerformatter 来设置日志格式, StreamHandler 即为输出在控制台的日志记录。 也可通过 logging.basicConfig 完成设置后,再进行实例化,设置将会保存至实例中。但在此之后的所有实例都将以此设置为基础进行实例化。

可设置的记录项,取自 logging官方文档(部分):

属性名称 格式 描述
asctime %(asctime)s 表示 LogRecord 何时被创建的供人查看时间值。 默认形式为 ‘2003-07-08 16:49:45,896’ (逗号之后的数字为时间的毫秒部分)。
created %(created)f LogRecord 被创建的时间。
filename %(filename)s pathname 的文件名部分。
funcName %(funcName)s 函数名包括调用日志记录。
levelname %(levelname)s 消息文本记录级别('DEBUG''INFO''WARNING''ERROR''CRITICAL')。
levelno %(levelno)s 消息数字的记录级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL).
lineno %(lineno)d 发出日志记录调用所在的源行号(如果可用)。
message %(message)s 记入日志的消息,即 msg % args 的结果。
module %(module)s 模块 (filename 的名称部分,不带文件后缀)。
msecs %(msecs)d LogRecord 被创建的时间的毫秒部分。
name %(name)s 用于记录调用的日志记录器名称。
pathname %(pathname)s 发出日志记录调用的源文件的完整路径名(如果可用)。
process %(process)d 进程 ID(如果可用)
processName %(processName)s 进程名(如果可用)
relativeCreated %(relativeCreated)d 以毫秒数表示的 LogRecord 被创建的时间,即相对于 logging 模块被加载时间的差值。
thread %(thread)d 线程 ID(如果可用)
threadName %(threadName)s 线程名(如果可用)

输出文件

logging.basicConfig(filename='log.log')

logger = logging.getLogger()
handler = logging.FileHandler('log.log')
logger.addHandler(handler)

未指定路径时,会在文件所在根目录创建日志文件。

### 相同 Logger 生成多个日志文件

通过添加多个 FileHandler 来生成多个日志文件,可根据文件名进行添加或删除的判断。以下代码示例为根据文件名删除指定 logger 对象中的 FileHandler

 logger = logging.getLogger()
 # 遍历 logger 对象中所有的 handler
 for handler in logger.handlers:
 	# 确定 handler 类型为 FileHandler,其他常用类型为 StreamHandler
	if type(handler).__name__ == "FileHandler":
		# 提取 handler 的文件名,排除文件路径对判断的干扰
		base_filename = Path(handler.baseFilename).stem

#待整理笔记

反向链接

到头儿啦~

局部关系图