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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:01:07