张芷铭的个人博客

Python logging 模块提供灵活的日志管理,支持多级别、多处理器、格式化和日志轮换,替代 print 实现生产级日志记录。

核心组件

组件说明
Logger日志记录器,核心对象
Handler输出目标(控制台、文件)
Formatter日志格式
Filter过滤规则

日志级别

级别数值用途
DEBUG10诊断信息
INFO20运行状态确认
WARNING30潜在问题提醒
ERROR40执行错误
CRITICAL50严重错误

快速使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
    handlers=[logging.StreamHandler()]
)

logging.info("程序启动")
logging.error("发生错误")

注意basicConfig 是全局配置,不适用于多 Logger 独立配置场景。

自定义 Logger

1
2
3
4
5
6
7
8
9
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

logger.debug("调试信息")

常用 Handler

Handler说明
StreamHandler输出到控制台
FileHandler输出到文件
RotatingFileHandler带轮换的文件输出

日志轮换

1
2
3
4
from logging.handlers import RotatingFileHandler

handler = RotatingFileHandler('app.log', maxBytes=10*1024*1024, backupCount=5)
logger.addHandler(handler)

格式占位符

占位符说明
%(asctime)s时间戳
%(name)sLogger 名称
%(levelname)s日志级别
%(message)s日志消息

综合示例

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

logger = logging.getLogger('app')
logger.setLevel(logging.DEBUG)

# 控制台输出 INFO 及以上
console = logging.StreamHandler()
console.setLevel(logging.INFO)

# 文件输出 DEBUG 及以上,自动轮换
file = RotatingFileHandler('app.log', maxBytes=5*1024*1024, backupCount=3)
file.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console.setFormatter(formatter)
file.setFormatter(formatter)

logger.addHandler(console)
logger.addHandler(file)

未捕获异常记录

1
2
3
4
5
6
7
8
9
import sys

def handle_exception(exc_type, exc_value, exc_traceback):
    if issubclass(exc_type, KeyboardInterrupt):
        sys.__excepthook__(exc_type, exc_value, exc_traceback)
        return
    logging.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback))

sys.excepthook = handle_exception

Comments