文章目录
1 概述
1.1 作用
- Python 的 logging 模块是一个强大的内置日志记录系统,它提供了灵活的日志记录功能
1.2 日志的6个级别
级别 | 数值 | 描述 | 举例 | |
---|---|---|---|---|
1 | NOTEST | - | 无 | |
2 | DEBUG | 10 | 调试 | 函数调用、变量值 |
3 | INFO | 20 | 一般信息 | 程序入参、执行结果 |
4 | WARNING | 30 | 警告 | 磁盘空间不足、网络连接中断 |
5 | ERROR | 40 | 错误 | 函数调用失败、异常 |
6 | CRITICAL | 50 | 严重错误 | 程序崩溃 |
注:日志的 数值 越高,日志的 级别 也就越高。
2 基础
2.1 logging:打印日志
import logging
logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
执行结果:(默认输出 warning 及以上的日志)
结果说明:
- 默认日志级别 warning:在默认情况下,只打印 warning 级别及以上的日志,低于该级别以下的日志信息将会被忽略
- 日志级别修改:可通过
logging.basiConfig
进行调整(下面有介绍) - root:日志记录器的名称,会随文件位置的改变而改变
2.2 logging.basicConfig:基础设置
import logging
logging.basicConfig(
level=logging.DEBUG, # 修改日志级别
format='%(asctime)s %(name)s [%(pathname)s line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S', # 日期时间格式
filename='log.txt', # 日志文件名
filemode='w' # 日志模式,如:w:写、a+:追加写 等
)
logger = logging.getLogger(__name__)
logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')
执行结果(log.txt)文件:
2024-01-12 21:24:36 root [E:/01 Python 项目/Demo/D01.py line:10] DEBUG debug
2024-01-12 21:24:36 root [E:/01 Python 项目/Demo/D01.py line:11] INFO info
2024-01-12 21:24:36 root [E:/01 Python 项目/Demo/D01.py line:12] WARNING warning
2024-01-12 21:24:36 root [E:/01 Python 项目/Demo/D01.py line:13] ERROR error
2024-01-12 21:24:36 root [E:/01 Python 项目/Demo/D01.py line:14] CRITICAL critical
2.3 format:常用参数
参数 | 解释 |
---|---|
%(name)s | logger 的名字 |
%(asctime)s | 时间 |
%(filename)s | 执行文件名 |
%(message)s | 日志信息 |
%(pathname)s | 执行程序的路径名 |
%(process)d | 进程ID |
%(thread)d | 线程ID |
%(threadName)s | 线程名称 |
%(levelno)s | 日志级别的数值 |
%(levelname)s | 日志级别的名称 |
%(lineno)d | 调用日志的代码所在行 |
3 进阶
3.1 logging 四个组成部分
英文名 | 中文名 | 描述 |
---|---|---|
Logger | 记录器 | 提供程序直接调用的接口,默认名称 root |
Handler | 处理器 | 将记录的日志发送到指定位置(终端 or 文件) |
Formatter | 格式器 | 用于控制日志信息的输出格式 |
Filter | 过滤器 | 决定哪些日志被输出 |
示例:
① logging 只能单纯的将日志输出到终端 或 文件中
② 若想将日志 同时输出到终端 和 文件中,则需要使用到上述组件,如下
import logging
# 创建记录器
logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG)
# 创建控制台处理器并设置级别
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
# 创建文件处理器并设置级别
file_handler = logging.FileHandler('app.log', mode='w', encoding='UTF-8')
file_handler.setLevel(logging.ERROR)
# 创建格式化器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 将格式化器添加到处理器
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 将处理器添加到记录器
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 记录日志
logger.debug('调试信息')
logger.info('一般信息')
logger.warning('警告信息')
logger.error('错误信息')
logger.critical('严重错误')
3.2 fileConfig:配置日志文件
- 创建一个配置文件(如 logging.conf):
- 一般仅修改下列的备注信息即可(复制时,请去掉 # 及其之后的内容)
[loggers]
keys=root,sampleLogger
[handlers]
keys=consoleHandler,fileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_sampleLogger]
level=DEBUG
handlers=fileHandler, consoleHandler # 输出到 文件, 控制台
qualname=sampleLogger
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=('app.log', 'w', 'utf-8') # 日志文件,模式,编码
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S
test01.py:读取日志配置文件
import logging.config
# 避免出现格式解析问题
with open('logging.conf', 'r', encoding='utf-8') as f:
logging.config.fileConfig(f)
logger = logging.getLogger('sampleLogger')
logger.debug('调试信息')