Categories
程式開發

Serverless架构下如何实现日志的实时输出?


Serverless白皮书中曾描述过Serverless的一些缺点,例如难以调试、冷启动严重等等。其中难以调试是表现在多个方面的,有一个方面是日志输出。

当我们把Serverless架构应用于实际项目,就会发现调试成为了效率的重要影响因素。以日志输出为例,某个函数被触发之后未得到预期结果,大家第一想法就是查看日志,但这时输出的日志可能并未是我们想要的,而且云厂商输出日志的延时也非常高。

日志输出现状

以腾讯云云函数为例,我们可以看一下其日志输出情况:

  • 通过控制台或者是云API的Invoke接口触发云函数:

Serverless架构下如何实现日志的实时输出? 1

通过这个测试功能,可以很快获取到函数的结果,并查看日志信息。

  • 通过API网关、COS等触发云函数,此处以API网关为例:

通过网关触发一个函数:

Serverless架构下如何实现日志的实时输出? 2

通过函数日志查看何时会刷出这个日志:

Serverless架构下如何实现日志的实时输出? 3

这个过程大概有11S,通过代码来进行更加详细的测试:

import json,time
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.scf.v20180416 import scf_client, models
try:
    cred = credential.Credential("", "")
    httpProfile = HttpProfile()
    httpProfile.endpoint = "scf.tencentcloudapi.com"

    clientProfile = ClientProfile()
    clientProfile.httpProfile = httpProfile
    client = scf_client.ScfClient(cred, "ap-guangzhou", clientProfile)

    req = models.InvokeRequest()
    params = '{"FunctionName":"test"}'
    req.from_json_string(params)

    resp = client.Invoke(req)
    functionRequestId = json.loads(resp.to_json_string())["Result"][ "FunctionRequestId"]

    print(time.time(), functionRequestId)

    while True:
        time.sleep(0.2)
        req = models.GetFunctionLogsRequest()
        params = '{"FunctionName":"test"}'
        req.from_json_string(params)

        resp = client.GetFunctionLogs(req)
        if functionRequestId in str(resp.to_json_string()):
            break

    print(time.time())


except TencentCloudSDKException as err:
    print(err)

原文链接:【https://www.infoq.cn/article/6gcWzU4jkeW5dLrU4j2H】。未经作者许可,禁止转载。