1.日志相关概念

概述:日志是记录程序运行时关键步骤、报错异常的一种重要信息。对查看业务运行情况,异常排查有着非常重要的作用。

1.1 日志级别

  • DEBUG:调试信息(最低)。
  • INFO:一般信息。
  • WARNING:警告,可能有问题。
  • ERROR:错误,已影响程序。
  • CRITICAL:严重错误(最高)。

1.2 日志格式

在这里插入图片描述

2. logging实现日志打印

实现步骤:
1.配置基本的日志配置
1.1 设置日志级别
1.2 自定义日志输出格式
2.获取日志记录器(日志对象)
3.打印输出不同级别日志

import logging
# 配置基本的日志设置
logging.basicConfig(
    level=logging.INFO,  # 设置日志级别
    format="%(asctime)s - %(levelname)s - %(name)s - %(message)s" # 自定义日志格式
)

# 获得日志记录器
logger = logging.getLogger("Example")

# 记录不同级别的日志
logger.debug("这是调试信息,通常用于开发")
logger.info("程序运行正常")
logger.warning("注意,可能有小问题")
logger.error("程序异常")
logger.critical("严重错误,程序可能崩溃")
'''
输出:
2026-07-12 20:07:29,987 - INFO - Example - 程序运行正常
2026-07-12 20:07:29,987 - WARNING - Example - 注意,可能有小问题
2026-07-12 20:07:29,987 - ERROR - Example - 程序异常
2026-07-12 20:07:29,987 - CRITICAL - Example - 严重错误,程序可能崩溃
'''

3. 将日志存储到文件

import logging

# 日志的基本配置
logging.basicConfig(
    filename=r'./logs/app.log',  # 将日志输出到./logs/app.log文件中
    level=logging.INFO,
    filemode="a",     # 追加模式
    format="%(asctime)s - %(levelname)s - %(name)s - %(message)s",  # 自定义文件格式
    encoding="utf-8"
)
# 创建日志记录器
logger = logging.getLogger("Test")

# 日志输出
logger.debug("这是调试信息,通常用于开发")
logger.info("程序运行正常")
logger.warning("注意,可能有小问题")
logger.error("程序异常")
logger.critical("严重错误,程序可能崩溃")

3.2 同时输出到控制台和文件

1.创建日志记录器,设置全局level
2.创建控制台处理器
设置日志级别
3.创建文件日志处理器
设置日志级别
4.定义日志输出格式
5.给两个日志控制器,设置输出格式
6.两个日志控制器加入大管家—日志记录器

import logging

# 创建日志记录器
logger = logging.getLogger(name="demo03")
logger.setLevel(level=logging.DEBUG)
# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(level=logging.DEBUG)
# 创建文件日志处理器
file_handler = logging.FileHandler(filename=r'./logs/app.log', mode="a", encoding="UTF-8")
file_handler.setLevel(level=logging.WARN)
# 自定义日志格式
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s")

# 给两个控制器设置输出格式
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# 两个日志控制器加入到日志记录器中(大管家)
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# 打印日志
logger.debug("调试信息,仅写入文件")
logger.info("程序运行正常")
logger.error("发生错误")

'''
输出:
2026-07-12 20:28:44,450 - DEBUG - demo03 - 调试信息,仅写入文件
2026-07-12 20:28:44,450 - INFO - demo03 - 程序运行正常
2026-07-12 20:28:44,450 - ERROR - demo03 - 发生错误
'''

代码分析:

  • 使用Handler分别控制输出目标
  • StreamHandler:输出到控制台。
  • FileHandler:输出到文件。
  • 不同处理器可设置不同级别,灵活性更高。

4.日志模块封装——工程结构

4.1 整体结构

logging_lesson/
├── logs/
│ └── app.log # 日志文件
├── utils/
│ └── logger.py # 日志配置模块
├── main.py # 主程序入口
└── requirements.txt # 依赖文件(本例无需额外依赖)

4.2 日志模块配置(utils/logger.py)

实现步骤:
1.新建python包——为封装之后引用
2.导入日志包
3.定义日志处理函数(模块名, 日志路径/名称)
4.日志文件、路径不存在时,创建对应目录、文件
5.创建日志记录器,设置全局level
6.创建控制台处理器
设置日志级别
7.创建文件日志处理器
设置日志级别
8.定义日志输出格式
9.给两个日志控制器,设置输出格式
10.两个日志控制器加入大管家—日志记录器

import logging, os


# 定义、封装日志处理函数
def setup_logger(name, log_file=r"logs/app01.log"):
    # 判断传入的日志文件是否存在,没有就新建
    os.makedirs(os.path.dirname(log_file), exist_ok=True)
    # 创建日志记录器
    logger = logging.getLogger(name)
    logger.setLevel(level=logging.DEBUG)
    # 创建控制台日志处理器
    consoler_handler = logging.StreamHandler()
    consoler_handler.setLevel(level=logging.DEBUG)
    # 创建文件日志处理器
    file_handler = logging.FileHandler(filename=log_file, mode="a", encoding="UTF-8")
    file_handler.setLevel(level=logging.INFO)
    # 自定义日志格式
    formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s")
    # 为两个控制器添加自定义格式
    consoler_handler.setFormatter(formatter)
    file_handler.setFormatter(formatter)

    # 将两个控制器加入大管家(日志记录器)进行调度
    if not logger.handlers:
        logger.addHandler(consoler_handler)
        logger.addHandler(file_handler)

    return logger

4.2 主函数调用日志模块

调用方式:入口函数__main__—> main() —> process_data()

from utils.logger01 import setup_logger

# 调用、初始化封装好的日志处理器
logger = setup_logger(name="qingyu")


# 定义数据处理函数
def process_data(data):
    logger.debug(f"开始处理数据{data}")
    if not data:
        logger.error("数据为空,无法处理")
        return None
    logger.info("数据处理完成")
    return data.upper()


# 主函数
def main():
    logger.info("程序启动...")
    result = process_data(data="hello")
    if result:
        logger.info(f"数据处理结果:{result}")
    else:
        logger.error("数据处理失败")
    logger.info("程序结束")
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐