You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Loguru多Python文件日志记录失效问题求助

Loguru多Python文件场景日志捕获问题解决

问题场景

之前使用Python标准logging库时,在主配置文件中定义一次日志配置后,其他子文件只需导入logging即可共享同一日志配置,日志能正常输出到指定位置。但切换到Loguru后,仅主文件中的日志能被输出,src目录下的子文件日志完全无法捕获。

项目结构:

myProject/
|- pythonFile_1.py
|- src/
|--- function_1.py
|--- function_2.py
|--- ...

问题原因

  • 标准logging的logging.info()本质是调用根logger的方法,所有子文件导入的logging模块共享同一个根logger配置。
  • Loguru的logger是全局单例实例,但你在主文件中将配置后的logger赋值给了局部变量logging,子文件中import logging导入的是标准库的logging模块,而非Loguru的单例logger,因此子文件的日志不会走Loguru的配置流程。

解决方案

方案1:子文件直接导入Loguru的logger(推荐)

Loguru的logger是全局单例,主文件中配置好logger.add()后,所有子文件导入的logger都会自动继承这些配置,无需额外处理。

主文件(pythonFile_1.py)配置

import sys
from loguru import logger

def defineLoguru(savingPath, fileName, fileTime):
    # 移除默认的stdout输出(可选,按需调整)
    logger.remove()
    # 添加文件处理器
    logger.add(f"{savingPath}/{fileName}_{fileTime}.log", rotation="1 day")
    # 添加控制台输出处理器
    logger.add(sys.stdout, format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}")
    return logger

# 初始化日志配置
logger = defineLoguru("logs", "app", "20240520")

logger.info("主文件日志内容")
from src.function_1 import function_1_1
function_1_1()

子文件(src/function_1.py)

from loguru import logger

def function_1_1():
    logger.info("子文件日志内容")
    # 业务逻辑代码

方案2:兼容原标准logging的用法(无需修改子文件)

如果想保持子文件中import logging的写法不变,可以通过拦截器将标准logging的日志转发到Loguru的logger。

主文件(pythonFile_1.py)配置修改

import sys
import logging
from loguru import logger

def defineLoguru(savingPath, fileName, fileTime):
    logger.remove()
    logger.add(f"{savingPath}/{fileName}_{fileTime}.log", rotation="1 day")
    logger.add(sys.stdout, format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}")
    
    # 定义拦截器,将标准logging的日志转发到Loguru
    class InterceptHandler(logging.Handler):
        def emit(self, record):
            # 匹配Loguru对应的日志级别
            try:
                level = logger.level(record.levelname).name
            except ValueError:
                level = record.levelno
            
            # 调用Loguru的日志方法
            logger.opt(depth=6, exception=record.exc_info).log(level, record.getMessage())
    
    # 配置标准logging使用拦截器
    logging.basicConfig(handlers=[InterceptHandler()], level=0)
    return logger

defineLoguru("logs", "app", "20240520")

logging.info("主文件日志内容")
from src.function_1 import function_1_1
function_1_1()

子文件保持原写法

import logging

def function_1_1():
    logging.info("子文件日志内容")
    # 业务逻辑代码

内容的提问来源于stack exchange,提问作者ShanN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 07:18:10