应用程序日志是提供关键洞察力,了解应用程序内部工作的重要信息。这些信息包括事件、错误和用户交互等宝贵的信息,可以帮助应用程序开发人员或运维支持工程师进行调试和提供支持。然而,当这些日志以英语以外的语言呈现时,对于无法阅读内容的开发人员来说,会产生重大障碍,并且会阻碍支持团队及时识别和解决问题的能力。
在本文中,我们将探讨一种解决方案,介绍如何使用Amazon Translate解除语言障碍。Amazon Translate是一种完全托管的神经机器翻译服务,可在广泛支持的语言范围内将文本翻译成英语或从英语翻译成其他语言。该解决方案将通过实时自动翻译Amazon CloudWatch中的所有应用程序日志来补充您现有的日志工作流程,从而缓解非英语应用程序日志带来的挑战。
解决方案概述
此解决方案向您展示如何使用三个关键服务以事件驱动的方式自动翻译应用程序日志:
- CloudWatch Logs 用于监控、存储和访问从各种来源(如AWS服务和应用程序)生成的日志文件
- Amazon Translate 用于执行文本的翻译
- AWS Lambda 是一种计算服务,可让您运行代码以检索应用程序日志,并通过使用 Amazon Translate SDK 对其进行翻译
下图显示了解决方案架构。
工作流程包括以下步骤:
- 自定义或第三方应用程序托管在Amazon Elastic Compute Cloud(Amazon EC2)实例上,并通过CloudWatch Logs代理将生成的应用程序日志上传到CloudWatch Logs。
- 写入CloudWatch Logs的每个日志条目触发订阅到CloudWatch日志组的Lambda函数。
- 函数处理日志条目的内容,并使用Amazon Translate SDK的translate_text函数将日志内容翻译。
- 将翻译后的日志内容返回给函数。
- 函数将翻译后的日志内容写回到不同的日志组中的CloudWatch Logs。
整个过程在实时自动完成,您的开发人员将能够从CloudWatch日志组中访问翻译后的应用程序日志,而不会改变现有应用程序将日志写入CloudWatch的方式。
先决条件
要按照此解决方案中的说明进行操作,您需要一个具有AWS CloudFormation、Amazon Translate、CloudWatch、Lambda和IAM权限的AWS帐户和AWS身份与访问管理(IAM)用户。
部署解决方案
要开始,请启动以下CloudFormation模板,以创建一个Lambda函数、两个CloudWatch日志组和IAM角色。继续使用默认设置进行部署。该模板大约需要1分钟完成。
成功创建堆栈后,您可以通过导航到Lambda控制台并定位函数translate-application-logs
来查看Lambda函数。
您可以观察到函数中添加了一个CloudWatch Logs触发器。
您可以通过导航到Configuration选项卡并在导航窗格中选择Triggers来查看触发器配置的详细信息。
您可以确认已配置触发器以订阅来自日志组/applicationlogs
的日志事件。这是非英语应用程序日志将被写入的位置。
接下来,在导航窗格中选择Environment variables。
这里提供了两个环境变量:
- source_language – 应用程序日志的原始语言(例如,日语为 ja)
- target_language – 将应用程序日志翻译到的目标语言(例如,英语为 en)
有关支持的语言列表,请参阅支持的语言和语言代码。
接下来,转到Code选项卡并查看函数逻辑:
import json, boto3, gzip, base64, os
translate = boto3.client(service_name='translate', region_name=os.environ['AWS_REGION'], use_ssl=True)
logs = boto3.client('logs')
def lambda_handler(event, context):
# 检索日志消息
encoded_zipped_data = event['awslogs']['data']
zipped_data = base64.b64decode(encoded_zipped_data)
data = gzip.decompress(zipped_data)
json_log = json.loads(data)
logGroup = json_log['logGroup']+'-'+os.environ['target_language']
logStream = json_log['logStream']
# 检查日志组是否存在,如果不存在则创建
dlg = logs.describe_log_groups(logGroupNamePrefix=logGroup)
if len(dlg['logGroups']) == 0:
logs.create_log_group(logGroupName=logGroup)
# 检查日志流是否存在,如果不存在则创建
dls = logs.describe_log_streams(logGroupName=logGroup, logStreamNamePrefix=logStream)
if len(dls['logStreams']) == 0:
logs.create_log_stream(logGroupName=logGroup, logStreamName=logStream)
# 将源语言到目标语言的日志事件消息进行翻译
for logevent in json_log['logEvents']:
logevent['message'] = translate.translate_text(Text=logevent['message'], SourceLanguageCode=os.environ['source_language'], TargetLanguageCode=os.environ['target_language']).get('TranslatedText')
del logevent['id']
# 将翻译后的日志事件写回到CloudWatch的不同日志组中
logs.put_log_events(
logGroupName = logGroup,
logStreamName = logStream,
logEvents = json_log['logEvents']
)
# 返回成功
return {
'statusCode': 200,
'body': '翻译成功!'
}
测试解决方案
最后,要测试解决方案,您可以通过CloudWatch控制台创建一个日志消息,并选择创建的日志组和日志流。
创建日志消息后,您将立即看到其被翻译的结果。
清理
要清理本文中创建的资源,请通过CloudFormation控制台删除CloudFormation堆栈。
结论
本文解决了开发人员和支持团队在应用程序日志以英语以外的语言呈现时面临的挑战,使他们难以进行调试和提供支持。所提出的解决方案使用Amazon Translate自动将非英语日志在CloudWatch中翻译,同时提供了部署解决方案的逐步指南。通过这个实现,开发人员现在可以无缝地跨越语言障碍,使他们能够迅速高效地解决问题。
试用这个实现,并在评论中告诉我们您的想法。