背影
Python标准库提供了一个日志记录系统,可以很方便的在python项目中添加日志记录。本文将详细介绍如何使用python的 logging 模块来记录日志。
日志级别
主要包括了5种日志级别,代表5种严重级别(严重程度由低到高):
- • DEBUG:提供详细的详细
- • INFO:程序运行的关键步骤信息
- • WARNING:警告信息
- • ERROR:程序错误,某个功能无法执行
- • CRITICAL:严重错误,可能整个程序无法执行
Logger提供了一个默认的记录器,称为root Logger。
代码语言:javascript复制import logging
logging.debug('Debug 级别日志信息')
logging.info('Info 级别日志信息')
logging.warning('Warning 级别日志信息')
logging.error('Error 级别日志信息')
logging.critical('Critical 级别日志信息')
输出结果如下:
代码语言:javascript复制WARNING:root:Warning 级别日志信息
ERROR:root:Error 级别日志信息
CRITICAL:root:Critical 级别日志信息
基本配置
可以使用basicConfig(**kwargs)
方法对日志系统进行配置。常用参数如下:
- • level: 指定严重级别。
- • filename: 指定文件。
- • filemode: 如果指定了filename,则以该模式打开文件。默认是a,表示追加。
- •
- • a:追加
- • w:覆盖
- • format:日志信息的格式。默认levelname, name和message属性,用冒号分隔。
注意:basicConfig
函数只能被调用一次。
level参数可以设置要记录的日志消息的严重级别
代码语言:javascript复制
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug('Debug 级别日志信息')
logging.info('Info 级别日志信息')
logging.warning('Warning 级别日志信息')
logging.error('Error 级别日志信息')
logging.critical('Critical 级别日志信息')
输出结果如下
代码语言:javascript复制DEBUG:root:Debug 级别日志信息
INFO:root:Info 级别日志信息
WARNING:root:Warning 级别日志信息
ERROR:root:Error 级别日志信息
CRITICAL:root:Critical 级别日志信息
保存日志到文件
代码语言:javascript复制
import logging
logging.basicConfig(filename='test.log', filemode='w', format='%(name)s - %(levelname)s - %(message)s')
logging.debug('Debug 级别日志信息')
logging.info('Info 级别日志信息')
logging.warning('Warning 级别日志信息')
logging.error('Error 级别日志信息')
logging.critical('Critical 级别日志信息')
输出结果如下:
代码语言:javascript复制root - WARNING - Warning 级别日志信息
root - ERROR - Error 级别日志信息
root - CRITICAL - Critical 级别日志信息
格式化输出
format
参数用于格式化输出设置,除了默认设置levelname, name和message属性:
属性名 | 使用格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 时间,默认格式为 ‘2003-07-08 16:49:45,896’ |
created | %(created)f | 时间戳 |
relativeCreated | %(relativeCreated)d | 相对于加载日志模块的时间(以毫秒为单位)。 |
msecs | %(msecs)d | 日志创建时间的毫秒部分 |
filename | %(filename)s | 脚本文件名称 |
funcName | %(funcName)s | 调用日志记录的函数名称 |
module | %(module)s | 脚本模块名 |
pathname | %(pathname)s | 脚本文件绝对路径名 |
name | %(name)s | 记录器名称,默认logger名为root |
levelname | %(levelname)s | 文本类型的日志级别 ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'). |
levelno | %(levelno)s | 数字类型的日志级别 (10, 20, 30, 40, 50). |
lineno | %(lineno)d | 日志调用的代码所在行号 |
message | %(message)s | 日志信息 |
process | %(process)d | 进程ID |
processName | %(processName)s | 进程名称 |
thread | %(thread)d | 线程ID |
threadName | %(threadName)s | 线程名 |
其中 asctime
时间格式可以使用 datefmt
属性更改,语法格式与python datetime模块的格式化函数相同,例如:
import logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(message)s', datefmt='%Y%m%d-%H:%M:%S')
logging.debug('Debug 级别日志信息')
logging.info('Info 级别日志信息')
logging.warning('Warning 级别日志信息')
logging.error('Error 级别日志信息')
logging.critical('Critical 级别日志信息')
输出结果如下:
代码语言:javascript复制20230716-15:59:17 - Debug 级别日志信息
20230716-15:59:17 - Info 级别日志信息
20230716-15:59:17 - Warning 级别日志信息
20230716-15:59:17 - Error 级别日志信息
20230716-15:59:17 - Critical 级别日志信息
除了以上属性外,还支持自定义属性,使用 extra
参数传递
import logging
FORMAT = '%(asctime)s - %(clientip)s - %(message)s'
logging.basicConfig(format=FORMAT)
clientip = '192.168.0.1'
d = {'clientip':clientip}
logging.info('Info 级别日志信息')
logging.warning('Warning 级别日志信息', extra=d)
捕获异常信息
设置 exc_info
参数为 True
可以输出信息报错信息:
import logging
try:
res = 1 / 0
except Exception as e:
logging.error(e, exc_info=True
输出结果
代码语言:javascript复制ERROR:root:division by zero
Traceback (most recent call last):
File "c:UsersAdministratorDesktoptmp 716a.py", line 4, in <module>
res = 1 / 0
~~^~~
ZeroDivisionError: division by zero
也可以使用 logging.exception()
方法,效果一样
logging.exception(e)
另外,stack_info
参数设置为 True
是可以打印堆栈信息。