繁体   English   中英

将日志从一个无服务器 function 发送到多个 cloudwatch 组

[英]Sending logs from one serverless function to multiple cloudwatch groups

我正在为一个 python 的应用程序开发一个 API,使用 FastAPI、无服务器和亚马逊 web 服务。 我们正在使用 CloudWatch 来保存我们的日志。 问题是,我需要将不同的日志发送到同一应用程序中的不同组,具体取决于它是错误、信息等。

比方说,我在 CloudWatch 中有两个日志组:/aws/lambda/firstGroup 和 /aws/lambda/secondGroup。

我有这个 function:

def foo(some_data):
    logger.info(f'calling the function with the data: {data}') # this goes to logGroup /aws/lambda/firstGroup
    try:
        doSomething()
    except:
        logger.error('ERROR! Something happened') # this goes to logGroup /aws/lambda/secondGroup

如何配置 serverless.yml 文件,以便 logger.info 进入第一组,而 logger.error 进入第二组?

提前致谢!

我将此解决方案与 ec2 实例一起使用。

  • 创建日志组
  • 创建日志 stream
  • 然后转储你的日志
import boto3
import time


# init clients
clw_client = boto3.client('logs', region_name=REGION)


# print("check else create new log group..")
try:
    clw_client.create_log_group(logGroupName=LOG_GROUP)
except clw_client.exceptions.ResourceAlreadyExistsException:
    pass

# print("check else create new log stream.....")
LOG_STREAM = '{}-{}'.format(time.strftime("%m-%d-%Y-%H-%M-%S"),'logstream')
try:
    clw_client.create_log_stream(logGroupName=LOG_GROUP, logStreamName=LOG_STREAM)
except clw_client.exceptions.ResourceAlreadyExistsException:
    pass
    
def log_update(text):
    print(text)
    response = clw_client.describe_log_streams(
        logGroupName = LOG_GROUP,
        logStreamNamePrefix = LOG_STREAM
        )
    
    try:
        event_log = {
            'logGroupName': LOG_GROUP,
            'logStreamName': LOG_STREAM,
            'logEvents': [{
                'timestamp': int(round(time.time() * 1000)),
                'message': f"{time.strftime('%Y-%m-%d %H:%M:%S')}\t {text}"
                }
            ],
        }

        if 'uploadSequenceToken' in response['logStreams'][0]:
            event_log.update({'sequenceToken': response['logStreams'][0] ['uploadSequenceToken']})

        response = clw_client.put_log_events(**event_log)
    except Exception as e:
        log_update(e)

然后随时在您的应用程序中调用 function。 只是不要一次又一次地检查groupsstream ,这些应该运行一次。

您可以更新它,添加更多逻辑,例如更改log-group名称,以仅使用一些if else语句来实现您在此问题中想要的内容。 祝你好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM