Python logging 模块提供灵活的日志管理,支持多级别、多处理器、格式化和日志轮换,替代 print 实现生产级日志记录。
核心组件
| 组件 | 说明 |
|---|
| Logger | 日志记录器,核心对象 |
| Handler | 输出目标(控制台、文件) |
| Formatter | 日志格式 |
| Filter | 过滤规则 |
日志级别
| 级别 | 数值 | 用途 |
|---|
| DEBUG | 10 | 诊断信息 |
| INFO | 20 | 运行状态确认 |
| WARNING | 30 | 潜在问题提醒 |
| ERROR | 40 | 执行错误 |
| CRITICAL | 50 | 严重错误 |
快速使用
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)s | Logger 名称 |
%(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