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

基于官方文档解析logging.getLogger(__name__)中logger与__name__的差异

好问题!这俩东西看起来有点关联,但本质完全是两码事,我给你拆解清楚:

核心区别详解

1. 本质与定位截然不同

  • __name__:这是Python每个模块自带的内置字符串属性,它的值是当前模块的唯一标识:

    • 如果你直接运行某个脚本,这个脚本里的__name__就是__main__;
    • 如果是把这个文件作为模块导入(比如import my_module),那它的__name__就是my_module;
    • 如果是包内的子模块(比如my_package/utils.py),__name__就是my_package.utils。
      它在这里的唯一作用,是给logging.getLogger()创建的Logger实例指定一个层级化的名字——logging模块靠这个名字来维护日志的继承关系(比如子Logger会自动继承父Logger的日志级别、处理器等配置)。
  • logger:这只是你自己定义的普通变量,它的作用是存储logging.getLogger(__name__)返回的Logger实例的引用。你后续调用logger.debug()、logger.error()这些日志方法,都是通过这个变量来操作对应的Logger实例。说白了,叫它log、app_logger甚至my_fancy_log都无所谓,只要它指向正确的Logger实例就行。

2. 一个是"身份ID",一个是"操作入口"

打个生活化的比方:

  • __name__就像是Logger的身份证号,logging模块用它来区分不同的Logger,管理它们的层级、配置和归属;
  • logger就是你拿到的门禁卡/操作权限,你用它来实际操控这个特定的Logger,发送日志、调整级别等等。

3. 功能上完全不能互相替代

举几个反例你就懂了:

import logging

# ✅ 正确用法:用__name__命名Logger,用logger变量操作
logger = logging.getLogger(__name__)
logger.info("正常输出日志")

# ❌ 错误:__name__是字符串,根本没有info方法
__name__.info("这行代码会直接报错")

# ❌ 错误:logger是实例对象,不能作为Logger的命名参数
another_logger = logging.getLogger(logger)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:50:00