便笺: python 日志同时输出到控制台和文件

发布于 2026-03-21 14:35 更新于 2026-03-21 14:35 255 字 2 min read

使 python 日志同时输出到控制台和文件,方便调试和查看日志。

简介

使 python 日志同时输出到控制台和文件,方便调试和查看日志。

代码实现

import logging
from pathlib import Path
import sys

def init_logger(level: str = "INFO", filename: str | Path | None = None) -> logging.Logger:
    """
    初始化 logger
    :param level: 日志级别
    :param filename: 日志文件名
    :return: logger 实例
    """

    # 创建 logger
    logger = logging.getLogger(__name__)
    logger.setLevel(level)  # 设置 logger 的级别
    logger.handlers.clear()  # 清空已有的处理器


    # 1. 创建文件处理器
    if not filename is None:
        log_dir = Path(filename).parent
        if not log_dir.exists():
            log_dir.mkdir(parents=True, exist_ok=True)
        file_handler = logging.FileHandler(Path(filename), encoding='utf-8')
        file_handler.setLevel(level)
    else:
        file_handler = None

    # 2. 创建控制台处理器
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setLevel(level)

    # 3. 设置日志格式
    formatter = logging.Formatter(
        "%(asctime)s - %(levelname)s - %(message)s"
    )
    file_handler.setFormatter(formatter) if not file_handler is None else None
    console_handler.setFormatter(formatter)

    # 4. 将处理器添加到 logger
    logger.handlers.clear()  # 清空已有的处理器
    if not file_handler is None:
        logger.addHandler(file_handler)
    logger.addHandler(console_handler)

    return logger

if __name__ == "__main__":
    logger = init_logger()
    logger.info("这是一条 info 日志")
    logger.error("这是一条 error 日志")
    # 重新初始化 logger
    logger = init_logger("DEBUG")
    logger.info("重新初始化 logger 后的第一条 info 日志")
    logger.debug("这是一条 debug 日志")

喜欢的话,留下你的评论吧~