【Python】logging 模块:标准日志库,记录日志信息、调试程序、监控系统

Python logging

logging 是 Python 的 标准日志库,用于 记录日志信息、调试程序、监控系统,适用于 应用开发、服务器监控、数据分析等场景


1. logging 主要功能

  • 支持不同级别的日志(DEBUG、INFO、WARNING、ERROR、CRITICAL)
  • 可以输出到控制台、文件、远程服务器
  • 支持日志格式化(时间、模块、行号等)
  • 支持日志滚动(按大小、时间分割日志文件)

2. logging 日志级别

logging 共有 5 个日志级别

级别代码适用场景
DEBUG10调试信息,仅开发环境使用
INFO20普通信息,正常运行日志
WARNING30警告信息,但程序仍可运行
ERROR40错误信息,影响功能
CRITICAL50严重错误,程序可能崩溃

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() 绑定 LoggerHandler

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

对比项loggingprint
适用于生产环境调试
支持日志级别
写入文件
多 Handler(控制台 + 文件)
日志格式化

生产环境推荐 logging避免 print() 影响性能


10. 总结

  • logging.basicConfig() 用于简单日志
  • getLogger() 创建 Logger,适用于复杂应用
  • FileHandler() 输出到文件
  • StreamHandler() 输出到控制台
  • RotatingFileHandler() 按文件大小切割日志
  • TimedRotatingFileHandler() 按时间切割日志

logging 适用于 服务器日志、调试日志、数据分析日志 等应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值