python日志无输出

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中,可以使用标准库中的 logging 模块来实现日志输出到多个文件。下面是一个简单的示例代码,演示了如何将日志同时输出到两个不同的文件中: ```python import logging # 创建 logger 对象 logger = logging.getLogger(__name__) # 创建文件处理器,将日志输出到 file1.log 文件中 file_handler_1 = logging.FileHandler('file1.log') file_handler_1.setLevel(logging.INFO) # 创建文件处理器,将日志输出到 file2.log 文件中 file_handler_2 = logging.FileHandler('file2.log') file_handler_2.setLevel(logging.WARNING) # 设置日志格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') file_handler_1.setFormatter(formatter) file_handler_2.setFormatter(formatter) # 将处理器添加到 logger 对象中 logger.addHandler(file_handler_1) logger.addHandler(file_handler_2) # 输出日志信息 logger.debug('debug message') logger.info('info message') logger.warning('warning message') logger.error('error message') logger.critical('critical message') ``` 在上面的代码中,我们首先创建了一个 logger 对象,并为其设置了两个不同的文件处理器。然后,我们设置了日志级别和日志格式,并将处理器添加到 logger 对象中。最后,我们通过 logger 对象输出了一些日志信息。 在运行上面的代码后,会在当前目录下生成两个日志文件:file1.log 和 file2.log。其中,file1.log 中包含了所有级别的日志信息,而 file2.log 中只包含了 WARNING、ERROR 和 CRITICAL 级别的日志信息。 如果需要输出到更多的日志文件,只需要创建更多的文件处理器,并将它们添加到 logger 对象中即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值