【问题标题】:Python logging using modules使用模块的 Python 日志记录
【发布时间】:2020-08-11 14:18:58
【问题描述】:

我有多个模块,由主脚本调用。每个都使用 logging Python 内置包记录消息。

如何在主脚本执行期间跨所有模块记录会话 ID,而无需在每个模块中推送此变量?

我已经建立了一个名为 config 的 python 配置文件:

import logging

logging.basicConfig(
    level=logging.DEBUG,
    format="%(filename)s:%(lineno)s|%(funcName)3s()|%(asctime)s|%(levelname)s|%(message)s",
    handlers=[
        logging.FileHandler("debug.log"),
        logging.StreamHandler()
    ]
)

其他模块正在使用这个预先配置的日志对象,通过导入,所以我使用这个:

from config import logging

但我需要从当前会话中记录一个 ID,我的日志应如下所示:

module_name.py:25|function_name()|2020-04-27 18:28:26,518|INFO|Session_ID=abc123|some_message_here

我试图把这个变量放在配置文件中,设置它,然后在这个文件中名为“log_info”和“log_debug”的函数中使用它,但是我的输出日志没有跟踪python脚本名称和函数名称没有了。

有谁知道如何处理这种情况?

【问题讨论】:

    标签: python logging module


    【解决方案1】:

    我不知道这是否是 100% 最佳解决方案,或者确定它是否适用于您的情况,但我将它用于类似的事情(会在多个脚本中持续存在的详细打印级别)。

    创建一个 Python 文件,命名为 sessionid。在其中,定义一个名为id 的顶级设置。要设置您的 id,import sessionid 和 sessionid.id = 'some_id'。然后让您的config 文件也导入sessionid 并根据需要使用sessionid.id。

    我花了一点时间才发现我必须像那样访问它;使用 from sessionid import id; id = 'some_id' 更改它只会在执行此操作的脚本中保留。

    将id 变量放在config 文件中是有意义的,但前提是您不需要在同样需要from config import logging 的脚本中设置它。

    【讨论】:

    • 嗨@CrazyChucky!感谢您的回复,但我有一个问题,按照您的解决方案,如何在日志记录中打印会话 ID?
    • 只需使用sessionid.id 变量。一种方法是将其绑定到 logger 对象的属性:logger.my_session_id = sessionid.id 然后从导入记录器的任何其他脚本中,您可以执行 msg = f'{logger.my_session_id}: a message'; logger.info(msg)
    • 或者,让任何需要它的脚本导入sessionid,然后在创建消息时让它访问sessionid.id,例如:msg = f'{sessionid.id}: a message'; logger.info(msg)
    • 嗨 @CrazyChucky,我已将我的解决方案移至 Flask,它确实支持在日志记录中使用自定义变量。我们可以按照flask.palletsprojects.com/en/1.1.x/logging/… 中的说明使用您的程序。我们需要做的就是在RequestFormatter中设置record.session_id = config.session_id属性,然后在运行时更新session_id
    猜你喜欢
    • 1970-01-01
    • 2017-06-04
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多