问题描述
我的应用程序通过AWS EC2 Javascript SDK动态创建EC2实例。每次创建时,都会通过UserData
方法中的runInstances
参数运行Bash脚本。此Bash脚本的日志记录出现在实例上的/var/log/cloud-init-output.log
中。当前,我必须手动登录到实例以查看此文件,该文件很繁琐且不可扩展。
如何将此日志流式传输到外部目标?我想使用ELK堆栈,但是我的日志记录解决方案的具体细节可能并不像弄清楚如何重定向cloud-init
日志记录那样重要。
解决方法
我想出了几种方法。
使用Logstash直接流式传输日志
通过这种方式,您需要在EC2实例上安装Logstash。但是您可以将日志流式传输到所需的任何位置,例如Amazon ES,ElasticCloud或您自己的ElasticSearch主机。
- 安装Logstash
- 这可以通过在
UserData
中编写脚本或通过安装Logstash创建自定义AMI来完成。 - Logstash可通过binary file,package manager和docker image获得。
- 配置
- Logstash配置文件如下:
input {
file {
path => ["/var/log/cloud-init-output.log"] # specify log file path here
}
}
# if you need to process log on the fly
# you can use filter plugin
# filter {}
output {
elasticsearch {
hosts => ["https://YOUR_ES_HOST"]
index => "YOUR_INDEX_NAME"
user => "YOUR_USERNAME"
password => "YOUR_PASSWORD"
}
}
- 启动Logstash服务
使用CloudWatch和Amazon ES
实施时间较少,但需要Amazon ES。
- 使用CloudWatch日志代理将日志推送到CloudWatch Logs。
- 可以在this page的“日志”部分中找到配置。
- 请确保在
/var/log/cloud-init-output.log
字段中设置file_path
。
- 在CloudWatch Logs中创建ElasticSearch订阅过滤器。
- 请参阅here。
当然有很多存档方法,这两个是相对简单的imo。
,您可以使用CloudWatch Agent将日志流式传输到CloudWatch日志。您可以从那里stream those logs到Elasticsearch。您将必须订阅日志并将其指向您的ELK堆栈。
另一个可能更简单的解决方案是使用fluentd。您可以使用它来收集所有local logs并将其直接运送到Elasticsearch。