如何将node.js日志从Elastic Beanstalk Docker应用程序发送到Cloudwatch日志?
Amazon提供了这些现成文件,用于将Tomcat/Apache/nginx日志发送到Cloudwatch日志,这非常有效 然而,出于我的目的,他们只发送nginx日志,这是不够的,不幸的是,他们也没有提供关于文件格式的文档。我试图实现的是将node.js日志从Docker应用程序发送到Cloudwatch(因为自动缩放使实例来去自如) 因此,在Cloudwatch中出现类似如何将node.js日志从Elastic Beanstalk Docker应用程序发送到Cloudwatch日志?,node.js,amazon-web-services,docker,amazon-elastic-beanstalk,amazon-cloudwatch,Node.js,Amazon Web Services,Docker,Amazon Elastic Beanstalk,Amazon Cloudwatch,Amazon提供了这些现成文件,用于将Tomcat/Apache/nginx日志发送到Cloudwatch日志,这非常有效 然而,出于我的目的,他们只发送nginx日志,这是不够的,不幸的是,他们也没有提供关于文件格式的文档。我试图实现的是将node.js日志从Docker应用程序发送到Cloudwatch(因为自动缩放使实例来去自如) 因此,在Cloudwatch中出现类似/var/log/eb docker/containers/eb current app/add839a3b599 st
/var/log/eb docker/containers/eb current app/add839a3b599 stdouterr.log
的文件
因此,到目前为止,我尝试从上面的链接调整webrequests配置:
##############################################################################
## Sends docker logs to CloudWatch Logs
##############################################################################
Mappings:
CWLogs:
ApplicationLogGroup:
LogFile: "/var/log/eb-docker/containers/eb-current-app/*-stdouterr.log"
TimestampFormat: "%Y-%m-%d %H:%M:%S"
Outputs:
ApplicationLogGroup:
Description: "The name of the Cloudwatch Logs Log Group created for this environments web server access logs. You can specify this by setting the value for the environment variable: WebRequestCWLogGroup. Please note: if you update this value, then you will need to go and clear out the old cloudwatch logs group and delete it through Cloudwatch Logs."
Value: { "Ref" : "AWSEBCloudWatchLogs8832c8d3f1a54c238a40e36f31ef55a0ApplicationLogGroup"}
Resources :
AWSEBCloudWatchLogs8832c8d3f1a54c238a40e36f31ef55a0ApplicationLogGroup: ## Must have prefix: AWSEBCloudWatchLogs8832c8d3f1a54c238a40e36f31ef55a0
Type: "AWS::Logs::LogGroup"
DependsOn: AWSEBBeanstalkMetadata
DeletionPolicy: Retain ## this is required
Properties:
LogGroupName:
"Fn::GetOptionSetting":
Namespace: "aws:elasticbeanstalk:application:environment"
OptionName: ApplicationLogGroup
DefaultValue: {"Fn::Join":["-", [{ "Ref":"AWSEBEnvironmentName" }, "stdouterr"]]}
RetentionInDays: 14
## Register the files/log groups for monitoring
AWSEBAutoScalingGroup:
Metadata:
"AWS::CloudFormation::Init":
CWLogsAgentConfigSetup:
files:
## any .conf file put into /tmp/cwlogs/conf.d will be added to the cwlogs config (see cwl-agent.config)
"/tmp/cwlogs/conf.d/stdouterr.conf":
content : |
[stdouterr]
file = `{"Fn::FindInMap":["CWLogs", "ApplicationLogGroup", "LogFile"]}`
log_group_name = `{ "Ref" : "AWSEBCloudWatchLogs8832c8d3f1a54c238a40e36f31ef55a0ApplicationLogGroup" }`
log_stream_name = {instance_id}
datetime_format = `{"Fn::FindInMap":["CWLogs", "ApplicationLogGroup", "TimestampFormat"]}`
mode : "000400"
owner : root
group : root
不幸的是,这似乎不起作用/
还有,有人知道如果fe出现日志吗。时间戳格式错误?特别重要的是,默认情况下,异常实际上没有时间戳,因此实际错误将消失
我的应用程序日志行当前如下所示:
2016-07-05 09:11:31::1-GET/200(5.107毫秒)
您可以使用此链接在beanstalk实例上设置cloudwatch代理(如果您还没有)-
下一步-尝试发送/var/lib/docker/containers/.json中的文件以收集docker日志。它是写入容器stdout和stderr的地方。什么意思?从
/var/lib/docker/containers/[container id]/[container id]-json.log
获取日志需要我知道容器的id,不是吗?日志文件:“/var/lib/docker/containers/***.log”
似乎可以工作,但是Cloudwatch中的所有日志条目都显示为json对象({“log”):“2016-07-05 12:17:12 10.0.1.180-GET/200(0.334 ms)\n”,“stream”:“stdout”,“time”:“2016-07-05T12:17:12.134355109Z”}
),这使得日志很难读取。:/有没有办法将它们作为“正常”日志条目?这是一个棘手的问题。解决这一问题的最佳方法是更改容器日志驱动程序(docker甚至有一个cloudwatch日志驱动程序)。我试着用beanstalk来做,但还没有成功。我猜有办法,但我还没有找到。你知道是否还有其他非旋转日志不是JSON吗?我已经用/var/log/eb docker/containers/eb current app/
处理日志文件:/var/log/eb docker/containers/eb current app/*.log“
但我猜,由于它们是旋转的,日志驱动程序不会捕获所有记录,而是在一次部署后似乎停止工作。不应该是这样。由于文件旋转,但保持相同的名称,因此日志驱动程序应该在旋转后继续捕获所有记录(减去可能在日志驱动程序捕获它之前旋转的某一小量,但这应该是无关紧要的)这是一个很好的问题,亚马逊没有让这个问题变得简单,这真的很荒谬,或者为什么他们在他们的示例中选择默认使用nginx或代理日志。感谢验证我不是疯狂地想要和期待同样的;-)