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
相关产品推荐
相关产品推荐

