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
未进行实例化时,会默认创建名称为 root
的 logger
实列,且默认输出严重于 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
时,通过添加handler
和formatter
来设置日志格式,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
#待整理笔记
反向链接
到头儿啦~