【问题标题】:Python flask logging: two different formats, but want one formatPython烧瓶日志记录:两种不同的格式,但想要一种格式
【发布时间】:2021-01-21 20:53:17
【问题描述】:

我正在使用 Flask 开发 REST API。

API 目前分为两个 Python 3.6 模块:update.py 和 vmware_exporters_support.py。

update.py 以我想要的方式记录。 vmware_exporters_support.py 没有按照我想要的方式记录。我希望 vmware_exporters_support.py 使用 update.py 的记录格式而不记录两次。

在 update.py 中,日志记录设置为:

from flask.logging import create_logger
app = Flask('collector_api')
logger = create_logger(app)    
import vmware_exporters_support

而作为 Flask 一部分的 create_logger 位于 https://github.com/pallets/flask/blob/1.1.x/src/flask/logging.py

然后在 vmware_exporters_support.py 中设置日志记录:

logger = logging.getLogger()

看起来这应该只是从 update.py 获取根记录器,但我不确定它是否真的考虑到它的行为有多么不同。

一个说明性的日志 sn-p 看起来像:

[2021-01-21 12:12:29,810] INFO in update: Writing container yaml /data/vmware-exporter/vmware_exporter_1
2021-01-21.12:12:29  INFO     Writing container yaml /data/vmware-exporter/vmware_exporter_1

[2021-01-21 12:12:29,810](带方括号)来自 update.py,2021-01-21.12:12:29(不带方括号)来自 vmware_exporters_support .py

我需要做什么才能让 vmware_exporters_support.py 使用与 update.py 相同的日志记录格式?

顺便说一句,update.py 是 __main__,而不是 vmware_exporters_support.py。

我使用的是 Flask 1.1.2。

提前致谢!

【问题讨论】:

    标签: python flask logging


    【解决方案1】:

    主要原因 - 你有 2 个不同的记录器

    create_logger() 使用 app.name 作为记录器名称 (collector_api)。但是在vmware_exporters_support.py 中,您创建了RootLogger(logger = logging.getLogger())。因此记录器可能有不同的处理程序和格式化程序。这是一个示例,它在您的情况下是如何工作的:

    import logging
    
    logger1 = logging.getLogger('collector_api')
    logger1.propagate = False
    ch = logging.StreamHandler()
    ch.setLevel(logging.INFO)
    fm = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    ch.setFormatter(fm)
    logger1.addHandler(ch)
    # logger2 without handler and formatter...
    logger2 = logging.getLogger()
    logger2.setLevel(logging.INFO)
    # uncomment later
    # for h in logger1.handlers:
    #     logger2.addHandler(h)
    
    logger1.info('first')
    logger2.info('second')
    

    运行脚本。您只会看到 1 条消息:2021-01-25 11:11:19,241 - collector_api - INFO - first

    现在尝试取消注释for h in logger1.handlers:...。您将看到 2 条消息:

    2021-01-25 11:13:53,593 - collector_api - INFO - first
    2021-01-25 11:13:53,593 - root - INFO - second
    

    因此您需要使用 1 个记录器或为 2 个记录器使用相同的处理程序和格式化程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      相关资源
      最近更新 更多