Note: Python log output to console and file simultaneously

Published 2026-03-21 14:35 Updated 2026-03-21 14:35 279 words 2 min read

To make Python logs output to both console and file simultaneously for convenient debugging and log viewing.

Translated by AI model Qwen/Qwen3-8B.

Source Language: Simplified Chinese, Target Language: english, Translation Time: 2026-05-01 04:03

.

AI translation is for reference only. Accuracy is not guaranteed, please refer to the original text.

Introduction

Enable Python logs to output simultaneously to the console and file, facilitating debugging and viewing logs.

Code Implementation

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 日志")

If you enjoyed this, leave a comment~