开发者社区 > 云原生 > Serverless > 正文

函数计算,请问一下python custom runtime 如何配置 logging,解决并发大于

函数计算,请问一下python custom runtime 如何配置 logging,解决并发大于 1 时,通过RequestId区分各并发请求的日志。

展开
收起
巴拉巴拉巴拉 2023-10-19 17:28:15 52 0
3 条回答
写回答
取消 提交回答
  • 在函数计算中,可以通过配置Python自定义运行时(Custom Runtime)来实现对logging模块的配置,以及通过RequestId区分并发请求的日志。

    以下是配置logging模块的步骤:

    1. 创建一个名为logging.json的配置文件,例如:
    {
      "version": 1,
      "formatters": {
        "default": {
          "format": "%(asctime)s %(levelname)s %(name)s %(message)s"
        }
      },
      "handlers": {
        "console": {
          "class": "logging.StreamHandler",
          "level": "INFO",
          "formatter": "default",
          "stream": "ext://sys.stdout"
        }
      },
      "root": {
        "level": "INFO",
        "handlers": ["console"]
      }
    }
    
    1. 在自定义运行时的bootstrap文件中,添加以下代码来配置logging模块:
    import logging.config
    import os
    
    def init_logging():
        logging_config_path = os.path.join(os.getcwd(), 'logging.json')
        if os.path.exists(logging_config_path):
            with open(logging_config_path, 'rt') as f:
                config = json.load(f)
            logging.config.dictConfig(config)
        else:
            logging.basicConfig(level=logging.INFO)
    
    def handler(event, context):
        init_logging()
        # 处理函数的逻辑
    

    通过以上步骤,你可以将自定义的logging配置文件应用到函数计算的Python自定义运行时中。

    要实现通过RequestId区分并发请求的日志,可以使用Python的threading模块来创建一个线程本地的变量来存储每个请求的RequestId。以下是一个示例:

    import threading
    
    request_id_local = threading.local()
    
    def handler(event, context):
        request_id_local.request_id = context.request_id
        # 处理函数的逻辑
    
    def log_message(message):
        request_id = getattr(request_id_local, 'request_id', None)
        if request_id:
            message = f"[RequestId: {request_id}] {message}"
        logging.info(message)
    

    在函数计算中,每个请求都会触发一个新的执行环境,因此可以使用线程本地变量来存储每个请求的RequestId,并在日志中添加该信息。

    2023-10-20 15:14:33
    赞同 展开评论 打赏
  • 从header中拿request id跟日志一块打印下

    此答案来自钉钉群“阿里函数计算官网客户”

    2023-10-20 08:49:04
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    Python custom runtime 中配置 logging,您需要执行以下步骤:

    1. 导入 logging 模块。

    import logging
    CopyCopy

    1. 创建一个日志记录器对象。

    logger = logging.getLogger()
    CopyCopy

    1. 设置日志记录器的级别。例如,要记录所有级别的日志,您可以使用 logging.DEBUG。

    logger.setLevel(logging.DEBUG)
    CopyCopy

    1. 创建一个日志处理器,将日志输出到控制台。

    console_handler = logging.StreamHandler()
    CopyCopy

    1. 设置日志处理器的基本配置。

    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    console_handler.setFormatter(formatter)
    CopyCopy

    1. 将日志处理器添加到日志记录器。

    logger.addHandler(console_handler)
    CopyCopy

    现在,您的 Python custom runtime 已经配置好了 logging。要解决并发大于 1 时,通过 RequestId 区分各并发请求的日志,您可以使用以下方法:

    1. 在您的代码中,为每个并发请求创建一个唯一的 RequestId。

    import uuid

    生成一个唯一的 RequestId

    request_id = str(uuid.uuid4())
    CopyCopy

    1. 在日志记录器中,将 RequestId 添加到日志记录器的记录中。

    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(request_id)s - %(message)s')
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)

    2023-10-20 08:17:22
    赞同 展开评论 打赏

快速交付实现商业价值。

相关产品

  • 函数计算
  • 相关电子书

    更多
    All in Serverless 阿里云核心产品全面升级 立即下载
    AIGC 浪潮之上,森马的 Serverless 实践之旅 立即下载
    极氪大数据 Serverless 应用实践 立即下载