适用于 Java 应用程序的 AWS Elastic Beanstalk 默认 CloudWatch 日志位置

Posted

技术标签:

【中文标题】适用于 Java 应用程序的 AWS Elastic Beanstalk 默认 CloudWatch 日志位置【英文标题】:AWS Elastic Beanstalk default CloudWatch log location for Java applications 【发布时间】:2020-12-23 07:33:27 【问题描述】:

我在 AWS Elastic Beanstalk 环境中部署了一个 JAR 文件,使用负载均衡器和最多 2 个 EC2 实例。

我的环境似乎在使用新的统一 CloudWatch 代理,而不是旧的 CloudWatch Logs 代理

在控制台的环境配置中,我打开了“将实例日志流式传输到 CloudWatch Logs”,现在在 CloudWatch Logs 中,我得到了以下组:

/aws/elasticbeanstalk/myapp-myenv/var/log/eb-engine.log /aws/elasticbeanstalk/myapp-myenv/var/log/eb-hooks.log /aws/elasticbeanstalk/myapp-myenv/var/log/nginx/access.log /aws/elasticbeanstalk/myapp-myenv/var/log/nginx/error.log /aws/elasticbeanstalk/myapp-myenv/var/log/web.stdout.log

这很好。值得注意的是,Web 服务器访问位于 access.log 中,甚至我的 JAR 文件的 STDOUT 控制台输出也在 web.stdout.log 中。到目前为止一切顺利。

现在假设我希望我的 JAR 应用程序生成一个日志文件并让它在 CloudWatch Logs 中自动获取。我已经阅读了Elastic Beanstalk EC2 logging documentation,它说我可以在我的应用程序中捆绑特殊的.ebextensions 以指示新的日志记录位置“[i]如果您的应用程序在不属于您的环境的默认配置的位置生成日志平台”。

在短期内,我宁愿不创建.ebextensions 文件。关于“……一个位置……默认配置的一部分……”的部分让我很感兴趣。

Elastic Beanstalk Java 平台日志是否有默认位置? 换句话说,是否有一些默认位置,例如 /var/log/app/,我可以简单地将我的应用程序日志记录到(例如通过环境变量配置)并让带有新统一代理的 CloudWatch Logs 自动获取它们,而无需创建 .ebextensions 文件? (作为第二好的解决方案,有没有办法可以使用 AWS 控制台配置位置?)

【问题讨论】:

【参考方案1】:

在新的统一 CloudWatch 代理中配置此功能非常容易。代理获取目录中存在的任何配置文件 - /etc/amazon/amazon-cloudwatch-agent/amazon-cloudwatch-agent.d/

您可以在该目录中创建自定义配置文件,


    "logs": 
        "logs_collected": 
            "files": 
                "collect_list": [
                    
                        "file_path": "path_to_file/app1.log",
                        "log_group_name": "/app/app.log",
                        "log_stream_name": "instance_id"
                    
                ]
            
        
    

您可以像这样拥有multiple config files。这些日志将与默认日志组一起在 CloudWatch Logs 中提供。

注意 - 查看 eb-engine.log,Elastic Beanstalk 在为每个部署运行 commands from .ebextension 和 prebuild hooks 之后重新设置了统一的 cloudwatch 代理,因此创建的任何文件在这些步骤中被删除。所以我建议你使用predeploy钩子来配置这个。

执行此操作的示例挂钩 -

将挂钩文件存储在 - .platform/hooks/predeploy/cwa_custom_logs.sh 并确保该文件在 git 中是可执行的。

#!/bin/sh

filepath="/etc/amazon/amazon-cloudwatch-agent/amazon-cloudwatch-agent.d/custom_logs.json"

# Create the file
cat > $filepath << 'EOL'

    "logs": 
        "logs_collected": 
            "files": 
                "collect_list": [
                    
                        "file_path": "path_to_file/app1.log",
                        "log_group_name": "/app/app.log",
                        "log_stream_name": "instance_id"
                    
                ]
            
        
    

EOL

# Change file permissions
chmod 000755 $filepath
chown root:root $filepath

# Restart cloudwatch agent
systemctl restart amazon-cloudwatch-agent.service

【讨论】:

【参考方案2】:

我不这么认为。您在问题中提到的日志文件被硬编码到配置文件/opt/aws/amazon-cloudwatch-agent/etc/beanstalk.json


        "logs": 
                "logs_collected": 
                        "files": 
                                "collect_list": [
                                        
                                                "file_path": "/var/log/eb-engine.log",
                                                "log_group_name": "/aws/elasticbeanstalk/A03cBeanstalkApplicationMybeanstalka-env/var/log/eb-engine.log",
                                                "log_stream_name": "instance_id"
                                        ,
                                        
                                                "file_path": "/var/log/eb-hooks.log",
                                                "log_group_name": "/aws/elasticbeanstalk/A03cBeanstalkApplicationMybeanstalka-env/var/log/eb-hooks.log",
                                                "log_stream_name": "instance_id"
                                        ,
                                        
                                                "file_path": "/var/log/nginx/access.log",
                                                "log_group_name": "/aws/elasticbeanstalk/A03cBeanstalkApplicationMybeanstalka-env/var/log/nginx/access.log",
                                                "log_stream_name": "instance_id"
                                        ,
                                        
                                                "file_path": "/var/log/nginx/error.log",
                                                "log_group_name": "/aws/elasticbeanstalk/A03cBeanstalkApplicationMybeanstalka-env/var/log/nginx/error.log",
                                                "log_stream_name": "instance_id"
                                        ,
                                        
                                                "file_path": "/var/log/web.stdout.log",
                                                "log_group_name": "/aws/elasticbeanstalk/A03cBeanstalkApplicationMybeanstalka-env/var/log/web.stdout.log",
                                                "log_stream_name": "instance_id"
                                        
                                ]
                        
                
        

aws:elasticbeanstalk:cloudwatch:logs 没有任何选项可以添加额外的日志文件。

在我看来,您必须通过 extensions 配置文件自定义配置文件。

【讨论】:

以上是关于适用于 Java 应用程序的 AWS Elastic Beanstalk 默认 CloudWatch 日志位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AWS Elastic Beanstalk 上安装/运行 Spark Java 框架?

适用于 Web 应用程序的 AWS 推送通知服务

适用于网站的 AWS 服务

使用适用于 Ruby 的 AWS 开发工具包发布到 SNS 主题时指定区域

如何安全地存储适用于 iOS 的 AWS 服务 ID?

无法通过 .ebextensions 文件更改 AWS 中的 tomcat 配置