Python logging
库
logging
是 Python 的 标准日志库,用于 记录日志信息、调试程序、监控系统,适用于 应用开发、服务器监控、数据分析等场景。
1. logging
主要功能
- 支持不同级别的日志(DEBUG、INFO、WARNING、ERROR、CRITICAL)
- 可以输出到控制台、文件、远程服务器
- 支持日志格式化(时间、模块、行号等)
- 支持日志滚动(按大小、时间分割日志文件)
2. logging
日志级别
logging
共有 5 个日志级别:
级别 | 代码 | 适用场景 |
---|---|---|
DEBUG | 10 | 调试信息,仅开发环境使用 |
INFO | 20 | 普通信息,正常运行日志 |
WARNING | 30 | 警告信息,但程序仍可运行 |
ERROR | 40 | 错误信息,影响功能 |
CRITICAL | 50 | 严重错误,程序可能崩溃 |
3. 基本日志记录
3.1 输出日志到控制台
import logging
# 配置日志(默认级别为 WARNING 及以上)
logging.basicConfig(level=logging.INFO)
logging.debug("这是 DEBUG 日志") # 不会显示(默认级别为 WARNING)
logging.info("这是 INFO 日志")
logging.warning("这是 WARNING 日志")
logging.error("这是 ERROR 日志")
logging.critical("这是 CRITICAL 日志")
输出
INFO:root:这是 INFO 日志
WARNING:root:这是 WARNING 日志
ERROR:root:这是 ERROR 日志
CRITICAL:root:这是 CRITICAL 日志
level=logging.INFO
只会显示INFO
及以上的日志。logging.debug()
不会显示。
3.2 自定义日志格式
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
logging.info("程序启动")
输出
2025-03-10 15:30:45 - INFO - 程序启动
format="%(asctime)s - %(levelname)s - %(message)s"
:设置 时间、日志级别、日志内容。datefmt="%Y-%m-%d %H:%M:%S"
:设置 时间格式。
4. 日志输出到文件
logging.basicConfig(
level=logging.DEBUG,
filename="app.log",
filemode="w", # "w" 覆盖日志,"a" 追加日志
format="%(asctime)s - %(levelname)s - %(message)s"
)
logging.info("日志已写入文件")
filename="app.log"
:日志写入app.log
filemode="w"
:覆盖模式(改为"a"
可追加日志)
文件内容(app.log)
2025-03-10 15:30:45 - INFO - 日志已写入文件
5. 使用 Logger
对象
basicConfig()
方式适用于简单日志,复杂应用推荐 Logger
。
import logging
# 创建 Logger
logger = logging.getLogger("my_logger")
logger.setLevel(logging.DEBUG)
# 创建 Handler(控制台输出)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# 创建 Formatter(格式化日志)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
console_handler.setFormatter(formatter)
# 添加 Handler
logger.addHandler(console_handler)
# 记录日志
logger.debug("这是 DEBUG")
logger.info("这是 INFO")
输出
2025-03-10 15:30:45 - my_logger - INFO - 这是 INFO
- 使用
getLogger("my_logger")
创建命名 Logger - 使用
setLevel(logging.DEBUG)
设置日志级别 - 使用
StreamHandler()
输出到控制台 - 使用
Formatter()
设置日志格式 addHandler()
绑定Logger
和Handler
6. 多个 Handler
(控制台 + 文件)
import logging
# 创建 Logger
logger = logging.getLogger("my_app")
logger.setLevel(logging.DEBUG)
# 创建文件 Handler
file_handler = logging.FileHandler("app.log")
file_handler.setLevel(logging.DEBUG)
# 创建控制台 Handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
# 设置日志格式
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 添加 Handler
logger.addHandler(file_handler)
logger.addHandler(console_handler)
# 记录日志
logger.info("日志输出到控制台 + 文件")
logger.debug("DEBUG 日志只在文件中")
输出
2025-03-10 15:30:45 - INFO - 日志输出到控制台 + 文件
文件 app.log
内容
2025-03-10 15:30:45 - INFO - 日志输出到控制台 + 文件
2025-03-10 15:30:45 - DEBUG - DEBUG 日志只在文件中
StreamHandler()
输出到控制台FileHandler()
保存到文件INFO
及以上日志同时输出,DEBUG
仅存文件
7. 滚动日志(按大小切割)
RotatingFileHandler
用于按文件大小分割日志
from logging.handlers import RotatingFileHandler
# 创建 Rotating File Handler
file_handler = RotatingFileHandler("app.log", maxBytes=1024, backupCount=3)
logger = logging.getLogger("rolling_logger")
logger.addHandler(file_handler)
logger.info("这是一条日志")
maxBytes=1024
:日志文件大小达到 1KB 后新建文件backupCount=3
:最多保留 3 个旧日志
日志文件:
app.log
app.log.1
app.log.2
app.log.3
8. 按日期分割日志
from logging.handlers import TimedRotatingFileHandler
# 每天生成一个新日志文件
handler = TimedRotatingFileHandler("app.log", when="D", interval=1, backupCount=7)
logger = logging.getLogger("time_logger")
logger.addHandler(handler)
logger.info("每天创建一个新日志文件")
when="D"
:每天创建新日志backupCount=7
:保留 7 天的日志
日志文件:
app.log
app.log.2025-03-10
app.log.2025-03-09
...
9. logging
vs print
对比项 | logging | print |
---|---|---|
适用于 | 生产环境 | 调试 |
支持日志级别 | ✅ | ❌ |
写入文件 | ✅ | ❌ |
多 Handler(控制台 + 文件) | ✅ | ❌ |
日志格式化 | ✅ | ❌ |
生产环境推荐 logging
,避免 print()
影响性能。
10. 总结
logging.basicConfig()
用于简单日志getLogger()
创建 Logger,适用于复杂应用FileHandler()
输出到文件StreamHandler()
输出到控制台RotatingFileHandler()
按文件大小切割日志TimedRotatingFileHandler()
按时间切割日志
logging
适用于 服务器日志、调试日志、数据分析日志 等应用。