python 笔记&logging

import logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('del_dir_all.log', encoding='utf-8'),
        logging.StreamHandler()
    ]
)

logging.basicConfig() 是 Python 日志模块的「快速配置函数」,用于设置日志系统的默认行为。如果不调用该函数,日志会使用默认配置(只输出 WARNING 及以上级别,打印到控制台,格式简单)。

level

作用:设置日志的「输出级别阈值」—— 只有级别 大于等于 该阈值的日志,才会被记录 / 打印。

日志级别(从低到高)

级别常量 数值 说明
logging.DEBUG 10 调试信息(开发时用)
logging.INFO 20 普通信息(正常运行状态)
logging.WARNING 30 警告信息(潜在问题)
logging.ERROR 40 错误信息(功能异常)
logging.CRITICAL 50 严重错误(程序崩溃)

当前配置效果:只输出 INFOWARNINGERRORCRITICAL 级别的日志,DEBUG 级别的日志会被过滤掉(不输出)。

format

作用:定义日志的「输出格式」,通过占位符(%(xxx)s)指定日志中包含的字段。

常用占位符说明

占位符 含义
%(asctime)s 日志记录的时间(可读格式)
%(levelname)s 日志级别名称(如 INFO/ERROR)
%(message)s 日志的具体内容(用户自定义信息)

格式效果示例

  • 2025-11-26 14:30:00,123 - INFO - 删除过期文件: /data/logs/20250101.log (大小: 1024字节)
    2025-11-26 14:30:01,456 - ERROR - 处理路径 /data/cache/old 时出错: 权限不足

handlers=[...]

作用:指定日志的「输出目标」(Handler 是日志的 “处理器”,负责将日志发送到不同地方)。
当前配置的两个 Handler
  • logging.FileHandler('cleanup.log', encoding='utf-8')
  • 「文件处理器」:将日志写入到指定文件中。
  • 参数说明:
    • 'del_dir_all.log':日志文件路径 + 名称(当前目录下生成 cleanup.log 文件,若已存在则追加内容)。
    • encoding='utf-8':文件编码格式,避免中文日志出现乱码(关键参数)。
  • logging.StreamHandler()
    • 「流处理器」:将日志打印到「控制台」(默认是 sys.stdout,即命令行 / 终端)。
    • 无额外参数:使用默认配置,直接输出到控制台。

总述

执行这段配置后,后续代码中使用 logging.xxx() 记录的日志会同时满足以下效果:
  1. 输出级别:只记录 INFO 及以上级别的日志(过滤调试信息)。
  2. 输出格式:每条日志包含「时间 + 级别 + 内容」,格式统一易读。
  3. 输出目标
    • 保存到文件:当前目录的 cleanup.log(UTF-8 编码,追加模式)。
    • 打印到控制台:运行程序的终端 / 命令行窗口。

补充说明

  • 若想输出 DEBUG 级别的日志(比如开发调试时),可将 level=logging.DEBUG
  • 若不想打印到控制台,只需移除 logging.StreamHandler()(仅保留文件输出)。
  • 日志文件会持续追加,若需按日期分割(如每天一个日志文件),需使用 RotatingFileHandler 或第三方库(如 logging.handlers.TimedRotatingFileHandler)。

以上注释来自于豆包摘录

import logging
from logging.handlers import RotatingFileHandler
import os

def setup_logger():
    # 1. 创建日志器(避免重复添加处理器)
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)  # 全局日志级别(低于此级别的日志不会被处理)
    logger.propagate = False  # 禁止日志向上传播(避免重复输出)

    # 2. 定义日志格式(包含更多实用信息,可按需调整)
    log_format = logging.Formatter(
        '%(asctime)s - %(name)s - %(process)d - %(threadName)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'  # 统一时间格式
    )

    # 3. 文件处理器:按大小滚动(10MB/个,无限保留)
    log_file = 'shouhou.log'
    max_bytes = 10 * 1024 * 1024  # 10MB(字节数)
    backup_count = 0  # 0 表示无限保留历史日志(默认值,显式写出更清晰)
    
    # 创建 RotatingFileHandler:达到大小上限时自动创建新文件(文件名后缀为 .1, .2, ...)
    file_handler = RotatingFileHandler(
        filename=log_file,
        maxBytes=max_bytes,
        backupCount=backup_count,
        encoding='utf-8',
        delay=False  # 立即创建日志文件(False 为默认,True 则首次日志时才创建)
    )
    file_handler.setLevel(logging.INFO)  # 文件处理器的日志级别(可独立于全局)
    file_handler.setFormatter(log_format)

    # 4. 控制台处理器(保持原需求,输出到终端)
    stream_handler = logging.StreamHandler()
    stream_handler.setLevel(logging.INFO)
    stream_handler.setFormatter(log_format)

    # 5. 避免重复添加处理器(关键!多次调用时防止日志重复输出)
    if not logger.handlers:
        logger.addHandler(file_handler)
        logger.addHandler(stream_handler)

    return logger

# 初始化日志器(全局使用)
logger = setup_logger()

# ---------------------- 测试代码 ----------------------
if __name__ == "__main__":
    # 测试日志输出(循环输出10万条,可快速达到10MB验证滚动效果)
    for i in range(100000):
        logger.info(f"测试日志滚动 - 第 {i+1} 条日志,用于验证10MB自动分割功能")

 

 

 

THE END
分享
二维码
打赏
海报
python 笔记&logging
import logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logg……
<<上一篇
下一篇>>