1. 最简单的开始

基础示例

import logging

# 设置日志级别(决定显示哪些信息)
logging.basicConfig(level=logging.INFO)

# 记录不同重要程度的信息
logging.debug("这是调试信息")      # 不会显示
logging.info("这是一般信息")       # 会显示
logging.warning("这是警告信息")    # 会显示
logging.error("这是错误信息")      # 会显示

运行结果:

INFO:root:这是一般信息
WARNING:root:这是警告信息
ERROR:root:这是错误信息

可以看到,debug 信息没有显示,因为级别设置为了 INFO

2. 理解日志级别

日志级别就像是"重要程度标签":

级别 数值 说明 使用场景
DEBUG 10 调试信息 开发时查看详细过程
INFO 20 一般信息 程序正常运行信息
WARNING 30 警告信息 不影响运行的小问题
ERROR 40 错误信息 某些功能无法正常工作
CRITICAL 50 严重错误 程序要崩溃了

记忆技巧: 级别越高,信息越重要,数量越少。

级别过滤示例

import logging

# 设置只显示 WARNING 及以上的日志
logging.basicConfig(level=logging.WARNING)

logging.debug("调试信息")     # 不显示
logging.info("一般信息")      # 不显示  
logging.warning("警告信息")   # 显示
logging.error("错误信息")     # 显示

3. 基本配置 - basicConfig

basicConfig 是 logging 的"快速设置"功能。

3.1 输出到文件

import logging

# 把日志保存到文件
logging.basicConfig(
    filename='my_app.log',  # 日志文件名
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

logging.info("程序启动")
logging.warning("磁盘空间不足")

运行后,会在当前文件夹生成 my_app.log 文件,内容:

2024-01-01 10:00:00 - INFO - 程序启动
2024-01-01 10:00:01 - WARNING - 磁盘空间不足

3.2 完整的 basicConfig 配置

import logging

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S',
    filename='app.log',
    filemode='w'  # 'w' 覆盖模式,'a' 追加模式
)

# 测试各种日志
logging.debug("这是调试信息")
logging.info("用户张三登录成功")
logging.warning("连接超时,正在重试")
logging.error("数据库连接失败")

4. 格式化字符串详解

format 参数控制日志的显示格式:

所有可用字段

字段 说明 示例
%(asctime)s 时间 2024-01-01 10:00:00
%(levelname)s 级别 INFO, ERROR
%(message)s 日志内容 用户登录成功
%(name)s logger名称 root
%(filename)s 文件名 example.py
%(lineno)d 行号 15
%(funcName)s 函数名 calculate
%(module)s 模块名 example

5. 项目实战使用

咋项目实战中, 使用handler处理器来进行日志记录

主要区别对比

特性 basicConfig Handler方式
输出目标 只能选一个:控制台文件 可以同时多个:控制台文件
日志级别 全局统一级别 可以为不同目标设置不同级别
文件处理 简单文件,会无限增大 支持轮转、分割、大小限制
灵活性 低,配置简单 高,可以自定义各种处理器
适用场景 小型项目、测试 生产环境、大型项目
# 日志的封装
# 导⼊ logging 模块
import logging

# 获取⼀个⽇志记录器对象,名称为当前模块的名称
logger = logging.getLogger(__name__)

# 设置⽇志记录器的级别为 DEBUG
# 这意味着所有级别为 DEBUG 及以上的⽇志都会被记录
logger.setLevel(logging.DEBUG)

# 创建⼀个 FileHandler 对象,指定⽇志⽂件的名称为 "test.log"
# 这个处理器会将⽇志信息写⼊到指定的⽂件中
handler = logging.FileHandler(filename="test.log")

# 创建⼀个⽇志格式器对象
formatter = logging.Formatter(
"%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d)] - %(message)s"
)

# 将格式器设置到处理器上
handler.setFormatter(formatter)

# 将这个处理器添加到⽇志记录器中
# 这样,⽇志记录器就会使⽤这个处理器来处理⽇志信息
logger.addHandler(handler)

if __name__ == "__main__":
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

步骤:

  1. 获取日志记录器: logging.getLogger(__name__) 获取⼀个日志记录器对象, name 是当前模块的名称。使用模块名称作为日志记录器的名称有助于在大型项目中区分不同模块的日志.
  2. 设置日志级别: logger.setLevel(logging.DEBUG) 将日志记录器的级别设置为DEBUG ,这意味着所有 DEBUG 及以上级别的日志都会被记录.
    日志级别金字塔:DEBUG < INFO < WARNING < ERROR < CRITICAL
    高于设定级别的日志才会被处理
  3. 创建文件处理器: logging.FileHandler(filename="test.log") 创建⼀个文件处理器,将日志信息写入到名为 test.log 的文件中.
  4. 添加处理器: logger.addHandler(handler) 将文件处理器添加到日志记录器中,这样日志记录器就会使用这个处理器来处理日志信息.
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐