我有多个 Lambda 函数。有没有一种方法可以将所有这些 Lambda 的日志重定向到特定的 CloudWatch 日志组,而不是每个 Lambda 都自己去。
我有多个 Lambda 函数。有没有一种方法可以将所有这些 Lambda 的日志重定向到特定的 CloudWatch 日志组,而不是每个 Lambda 都自己去。
事实证明另一个问题类似,目前似乎没有办法聚合来自不同lambda服务的日志。
我最终创建了一个SQS FIFO队列。从lambda向队列发送日志消息,并创建一个Log Lambda,它基本上会打印出sqe队列中的所有消息。
当我想查看日志时,我会进入Log Lambda的CloudWatch日志,其中包含所有日志并以顺序排列。
local_logger = Logger(
service="name", level=os.environ.get("LOG_LEVEL", "INFO").upper(), region="region"
))
将其替换为一个记录器,该记录器记录到您的日志组中:logs_client = boto3.client('logs', region_name=os.environ['AWS_REGION'])
# Send logs to the custom log stream
logs_client.create_log_stream(
logGroupName=log_group_name,
logStreamName=log_stream_name
)
# Add the custom handler to the logger
local_logger.addHandler(CloudWatchLogHandler(logs_client, log_group_name, log_stream_name))
import logging
from aws_lambda_powertools import Logger
class CloudWatchLogHandler(logging.StreamHandler):
def __init__(self, log_client: Logger, log_group_name: str, log_stream_name: str, context_id: str):
super().__init__()
self.logs_client = log_client
self.log_group_name = log_group_name
self.log_stream_name = log_stream_name
self.context_id = context_id
def emit(self, record):
log_entry = self.format(record)
log_json = {
'level': record.levelname,
'location': f"{record.funcName}:{record.lineno}",
'message': log_entry,
'timestamp': int(record.created * 1000),
'service': record.name,
'correlation_id': self.context_id
}
self.logs_client.put_log_events(
logGroupName=self.log_group_name,
logStreamName=self.log_stream_name,
logEvents=[{
'timestamp': int(record.created * 1000),
'message': str(log_json),
}]
)