[英]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 实例一起使用。
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。 只是不要一次又一次地检查groups
和stream
,这些应该运行一次。
您可以更新它,添加更多逻辑,例如更改log-group
名称,以仅使用一些if else
语句来实现您在此问题中想要的内容。 祝你好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.