• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

python日志无输出

武飞扬头像
Fighting-年轻人就该张牙舞爪
帮助1

python logging一场 disabled引发的血案
以fastapi为例,启动用的uvicorn.run()当用户配置了自己日志之后,框架自带的日志就无输出了
这篇文章以两个部分说明原理
第一部分: 伪代码复现场景
第二部分: uvicorn源码

  • 第一部分: 以下方代码为例复现场景
    • code
      import logging
      import logging.config
      
      logging.basicConfig(
          level=logging.DEBUG,
          format="basicConfig:test >> %(asctime)s %(filename)s:%(lineno)d [%(levelname)s] %(message)s"
      )
      
      test_logger = logging.getLogger("demo")
      
      
      def init_logger():
          config = {
              "version": 1,
              "formatters": {
                  "simple": {
                      "format": "init_logger>> %(asctime)s %(filename)s:%(lineno)d [%(levelname)s] [%(funcName)s] %(message)s"
                  }
              },
              "handlers": {
                  "console": {
                      "class": "logging.StreamHandler",
                      "formatter": "simple",
                      "level": "DEBUG",
                      "stream": "ext://sys.stdout"
                  },
                  "run": {
                      "backupCount": 5,
                      "class": "logging.handlers.RotatingFileHandler",
                      "encoding": "utf-8",
                      "filename": "./run.log",
                      "formatter": "simple",
                      "level": "DEBUG",
                      "maxBytes": 104857600
                  }},
              "loggers": {
                  "run": {
                      "handlers": [
                          "console",
                          "run"
                      ],
                      "level": "INFO",
                      "propagate": False
                  }
              },
              "root": {
                  "handlers": [
                      "console"
                  ],
                  "level": "DEBUG"
              }
          }
      
          logging.config.dictConfig(config)
          return logging.getLogger('run')
      
      
      test_logger.info("test_logger start")
      
      logger = init_logger()
      logger.info("用户初始化的日志")
      # test_logger.disabled = False
      test_logger.info("test_logger end")
      
    • 输出
      学新通
      如上 以上test_logger end无输出, 在放开 test_logger.disabled = False 这行注释后,可以正常输出如下
      学新通
      日志的disabled 属性意义在于显示地将隐藏的日志句柄打开,具体的实现原理可以翻看源码。
      另外注意一点: 在解开注释之后test_logger.info("test_logger end")这行的输出并没有用test_logger.info("test_logger start")一样的格式,因为用户init_logger配置的formatters覆盖了之前的格式,这个是正常的。

  • 第二部分:uvicorn源码
    • site-packages/uvicorn/config.py 这个文件定义了uvicorn自带的日志配置
      学新通
    • site-packages/uvicorn/workers.py 日志实例化在这里, 这里的两个日志句柄输出框架的基本打印信息
      学新通
      用户init_logger之后会覆盖掉之前的配置,又因为新的配置没有以上两个配置,遂logging模块会将其的disabled置为True意为隐藏,想要继续输出需要显示的将其置为False

官方文档才是yyds

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfijia
系列文章
更多 icon
同类精品
更多 icon
继续加载