logging模块使用

使用print打印信息遇到稍微复杂的python脚本就会炸:一大堆结果和调试信息混杂在一起啥情况都看不出来。写了一个从MDX文件读取17万条文本数据格式化成json再转存sqlite3的脚本,格式话过程使用logging模块来调试例外情况还是相当舒适的。

基础使用

实现简单的日志输出

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import logging


logging.basicConfig(
# 设置日志等级
level=logging.DEBUG,
# 设置日志输出格式
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
# 设置日期输出格式
datefmt="%Y-%m-%d %H:%M:%S",
# 输出日志到文件
filename="test.log"
)
# 输出日志
logging.debug("一条调试信息")
logging.info("一条普通信息")
logging.warning("一条警告信息")
logging.error("一条错误信息")
logging.critical("一条严重错误信息")

错误级别

错误级别 细节
DEBUG 详细的调试信息,通常用于开发阶段
INFO 程序正常运行时的信息
WARNING 表示潜在的问题,但程序仍能正常运行
ERROR 表示程序中的错误,导致某些功能无法正常工作
CRITICAL 表示严重的错误,可能导致程序崩溃

拓展用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import logging
from logging.handlers import MemoryHandler, RotatingFileHandler

# =============================================
# ====================
# 基础配置
# ====================

# 创建日志记录器
logger = logging.getLogger("my_app")
logger.setLevel(logging.DEBUG) # 设置全局最低记录级别

# ====================
# 定义处理器
# ====================

# 1. 控制台处理器(实时输出)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO) # 控制台只显示INFO及以上级别

# 2. 文件处理器(直接写入)
file_handler = RotatingFileHandler(
filename="app.log",
maxBytes=1024*1024, # 1MB自动分割
backupCount=5, # 保留5个备份
encoding="utf-8"
)
file_handler.setLevel(logging.DEBUG) # 文件记录所有DEBUG及以上级别

# 3. 内存缓冲处理器(需关联到文件处理器)
buffer_handler = MemoryHandler(
capacity=100, # 缓冲100条记录
flushLevel=logging.ERROR, # 遇到ERROR立即刷新
target=file_handler # 最终输出到文件处理器
)

# ====================
# 设置日志格式
# ====================
formatter = logging.Formatter(
"[%(asctime)s][%(levelname)s][%(filename)s:%(lineno)d] %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)

console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# ====================
# 绑定处理器
# ====================
logger.addHandler(console_handler)
logger.addHandler(buffer_handler) # 注意:不直接添加file_handler
# =============================================

#
logger.debug("这段不会打印到控制台,但是会写入到日志文件中")
logger.error("出错啦")

控制台结果如下

1
[2025-05-04 10:17:08][ERROR][log.py:75] 出错啦

日志文件结果如下

1
2
[2025-05-04 10:21:54][DEBUG][log.py:75] 这段不会打印到控制台,但是会写入到日志文件中
[2025-05-04 10:21:54][ERROR][log.py:76] 出错啦

流程图