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

Logger应作为函数参数还是全局变量?二者差异与优势解析

两种Python日志写法的区别:线程安全与风格选择

先给你吃颗定心丸:这两种写法都是线程安全的!Python标准库的logging模块从设计之初就内置了锁机制,不管你是传logger实例还是用模块级的LOGGER,多线程环境下写日志都不会出现日志混乱、内容重叠的问题,这点完全不用担心。

接下来咱们聊聊两种写法的核心差异,其实本质是设计思路和使用场景的不同:

第一种:函数参数传入logger

def something(logger):
    logger.info('doing something')
  • 这是依赖注入的思路,灵活性拉满。比如写单元测试时,你可以轻松传一个mock logger进去,不用改动业务代码就能验证日志输出;如果某个场景需要临时切换日志目标(比如输出到特定文件或者控制台),直接传不同的logger实例就行,函数本身和日志实现完全解耦。
  • 但缺点也很明显:如果项目里大量函数都需要打日志,每次调用都得传logger参数,代码会显得啰嗦,重复度较高。

第二种:模块级定义LOGGER

import logging
LOGGER = logging.getLogger(__name__)

def something():
    LOGGER.info('doing something')
  • 这是Python社区最常用的日志写法,简洁又省心。每个模块用__name__定义专属logger,日志里会自动带上模块名称,排查问题时能快速定位到日志来源,实用性拉满。
  • 代价是耦合度稍高:函数和模块的logger绑定在了一起,如果要替换logger(比如测试场景),得修改模块级的LOGGER变量,不如依赖注入那么灵活。

总结

这两种写法本质上就是风格和设计思路的差异,和线程安全没有半毛钱关系。怎么选看你的需求:

  • 要是追求代码灵活、方便测试,优先选第一种;
  • 要是想代码简洁、遵循社区常规实践,第二种绝对是大多数人的首选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:11:02