java - 日志在 Elastic Beanstalk Tomcat 环境中不起作用
问题描述
我们一直在使用 Elastic Beanstalk 在我们公司的 Tomcat 上运行我们的 Java (8) 应用程序,没有任何问题。现在我们决定继续使用 Java 11。我们使用 CloudFormation 设置环境,就像我们之前为 Java 8 应用程序所做的那样,但现在我们正在使用这个解决方案堆栈:'64bit Amazon Linux 2 v4.1.1 running Tomcat 8.5 Corretto 11' (也尝试过 v4.1.2)。一切正常,但看起来请求日志功能在弹性 beantalk 中不再起作用(最后 100 行和完整日志)。我还向应用程序服务器添加了一个密钥对,以检查 /var/log/tomcat/ ec2 服务器上的日志,但我们找不到 catalina.out 文件(只有 catalina 文件的日期如下:catalina.2020-10 -14.log)。这些文件仅包含我们使用的库的日志,但不包含我们发送到标准系统输出的日志。
有没有人在这个解决方案堆栈上遇到过同样的问题并找到了解决方法?
这是我们的 CloudFormation 配置 (YAML):
Application:
Type: AWS::ElasticBeanstalk::Application
Properties:
Description: Application backend
ApplicationVersion:
Type: AWS::ElasticBeanstalk::ApplicationVersion
Properties:
ApplicationName:
Ref: Application
Description: !Ref AppVersion
SourceBundle:
S3Bucket: !Ref BeanstalkSourceS3
S3Key: !Ref BuildFileName
AppEC2ServiceRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- elasticbeanstalk.amazonaws.com
Action:
- sts:AssumeRole
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkEnhancedHealth"
- "arn:aws:iam::aws:policy/service-role/AWSElasticBeanstalkService"
AppEnvironment:
Type: AWS::ElasticBeanstalk::Environment
Properties:
ApplicationName:
Ref: Application
OptionSettings:
- Namespace: aws:autoscaling:launchconfiguration
OptionName: InstanceType
Value: !Ref EC2InstanceSize
- Namespace: aws:elasticbeanstalk:environment
OptionName: EnvironmentType
Value: SingleInstance
- Namespace: aws:autoscaling:launchconfiguration
OptionName: IamInstanceProfile
Value: !Ref AppInstanceProfile
- Namespace: aws:autoscaling:launchconfiguration
OptionName: EC2KeyName
Value: CompanyTestKey
- Namespace: aws:ec2:vpc
OptionName: VPCId
Value: !Ref Vpc
- Namespace: aws:ec2:vpc
OptionName: Subnets
Value: !Join [",",https://forums.aws.amazon.com/
- Namespace: aws:ec2:vpc
OptionName: AssociatePublicIpAddress
Value: true
- Namespace: aws:elasticbeanstalk:environment
OptionName: ServiceRole
Value: !Ref AppEC2ServiceRole
- Namespace: aws:elasticbeanstalk:cloudwatch:logs
OptionName: StreamLogs
Value: true
- Namespace: aws:elasticbeanstalk:cloudwatch:logs
OptionName: RetentionInDays
Value: 14
SolutionStackName: 64bit Amazon Linux 2 v4.1.1 running Tomcat 8.5 Corretto 11
VersionLabel:
Ref: ApplicationVersion
Tags:
- Key: group
Value: !Ref ResourceGroupTagValue
解决方案
我在一个新的Medium 博客中详细介绍了这一切如何适用于 Tomcat,我遇到了类似的问题,尤其是由于 S3 日志轮换导致的零长度文件。
以下是您可能可以使用的摘录,该文章解释了如何确定要流式传输的正确文件夹/文件。
在这里,我正在流式传输三个不同的文件(它自动处理您提到的日期),查看您需要流式传输的每个文件的 logs.conf 'content' 部分下的内容。
不要忘记还设置使 Elastic Beanstalk EC2 实例能够与 CloudWatch 通信的策略和角色。
packages:
yum:
awslogs: []
option_settings:
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: StreamLogs
value: true
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: DeleteOnTerminate
value: false
- namespace: aws:elasticbeanstalk:cloudwatch:logs
option_name: RetentionInDays
value: 90
files:
"/etc/awslogs/awscli.conf" :
mode: "000600"
owner: root
group: root
content: |
[plugins]
cwlogs = cwlogs
[default]
region = `{"Ref":"AWS::Region"}`
"/etc/awslogs/config/logs.conf" :
mode: "000600"
owner: root
group: root
content: |
[/var/log/tomcat/localhost.log]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/tomcat/localhost.log"]]}`
log_stream_name = {instance_id}
file = /var/log/tomcat/localhost.*
[/var/log/tomcat/catalina.log]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/tomcat/catalina.log"]]}`
log_stream_name = {instance_id}
file = /var/log/tomcat/catalina.*
[/var/log/tomcat/localhost_access_log.txt]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/tomcat/access_log"]]}`
log_stream_name = {instance_id}
file = /var/log/tomcat/access_log.*
commands:
"01":
command: systemctl enable awslogsd.service
"02":
command: systemctl restart awslogsd
推荐阅读
- javascript - 在空格键上播放的音频点击
- css - 在第一行有行跨度的情况下,在表格的第一行设置 css 样式
- terraform - 通过 REST API 公开 Terraform
- python - 不再支持将“将列表喜欢传递给 .loc 或 [] 并带有任何缺失标签的数据框,我该如何解决?
- javascript - 如何使用 mongodb 中的 $nin 运算符从集合中获取文档
- java - 在 Reactive 编程用户 Reactor 中创建相互依赖的 Flux
- google-maps - 如何让我的谷歌地图显示 2 个以上的多边形边界?
- r - 用于计算R中坐标之间距离的Distm函数
- python - 气流:使用 BashOperator 运行时,Python 脚本如何发出失败的任务信号
- c++ - 使用 OpenCV 的 memcpy:为什么视频帧需要 ftruncate,而图像不需要?