Python logging如何实现多模块日志同文件输出且差异化配置格式
实现方案
核心逻辑是放弃全局统一格式的配置方式,让不同模块的独立日志器各自持有格式配置,共用同一个日志输出文件,同时通过日志适配器注入动态变化的IP字段,避免全局格式冲突。
关键配置要点
- 不在
logging.basicConfig()中绑定全局固定格式,避免所有模块强制复用同一种输出格式 - 每个模块的专属日志器关闭向上传播(
propagate=False),防止日志重复写入 - 各模块日志器单独绑定指向
main.log的文件处理器,配置自身需要的输出格式 - 主程序中动态传入的IP参数通过
LoggerAdapter注入日志上下文,不需要反复修改日志器的格式配置
修改后代码
main.py
import module1 import logging # 根日志基础配置,不绑定全局格式 logging.basicConfig( filename="main.log", level=logging.DEBUG, filemode="a" ) # 初始化主程序专属日志器 main_logger = logging.getLogger("main") main_logger.propagate = False main_logger.setLevel(logging.DEBUG) # 绑定主程序专属的文件处理器与格式(预留IP字段位置) main_handler = logging.FileHandler("main.log") main_fmt = logging.Formatter( format="%(asctime)s , <%(name)s> , [%(ip)s] , %(levelname)s : %(message)s", datefmt="%Y-%m-%d %I:%M:%S" ) main_handler.setFormatter(main_fmt) main_logger.addHandler(main_handler) def main(ip): # 注入当前调用上下文的IP,如需日志名显示为main1可直接修改getLogger名称参数 lg = logging.LoggerAdapter(main_logger, extra={"ip": ip}) lg.debug("somthing done...") module1.func1() lg.debug("service done") def main2(ip): lg = logging.LoggerAdapter(main_logger, extra={"ip": ip}) lg.debug("somthing done...") module1.func1() lg.debug("service done") main("192.168.1.100") main2("192.168.1.101")
module1.py
import logging # 初始化模块专属日志器 module_logger = logging.getLogger("module1.func1") module_logger.propagate = False module_logger.setLevel(logging.DEBUG) # 绑定同一份日志文件的处理器,使用模块自己的基础格式 module_handler = logging.FileHandler("main.log") module_fmt = logging.Formatter( format="%(asctime)s , <%(name)s> , %(levelname)s : %(message)s", datefmt="%Y-%m-%d %I:%M:%S" ) module_handler.setFormatter(module_fmt) module_logger.addHandler(module_handler) def func1(): module_logger.debug("done")
运行效果
执行代码后main.log输出内容与预期完全匹配:
2022-07-02 05:39:51 , <main> , [192.168.1.100] , DEBUG : somthing done... 2022-07-02 05:39:51 , <module1.func1> , DEBUG : done 2022-07-02 05:39:51 , <main> , [192.168.1.100] , DEBUG : service done 2022-07-02 05:39:51 , <main> , [192.168.1.101] , DEBUG : somthing done... 2022-07-02 05:39:51 , <module1.func1> , DEBUG : done 2022-07-02 05:39:51 , <main> , [192.168.1.101] , DEBUG : service done
后续新增其他导入模块时,只需要按照
module1.py的模式配置自身日志器、绑定到main.log、设置自定义格式即可,不会和其他模块的日志格式冲突。进程内多个FileHandler写入同一个日志文件是线程安全的,不会出现日志错乱问题。
内容的提问来源于stack exchange,提问作者milad vakili
相关产品推荐
相关产品推荐

