logging - 如何将 AWS EC2 cloud-init 日志流式传输到 ELK?
问题描述
我的应用程序通过 AWS EC2 Javascript SDK 动态创建 EC2 实例。每次创建时,都会通过方法UserData
中的参数运行一个 Bash 脚本runInstances
。此 Bash 脚本的日志记录显示在/var/log/cloud-init-output.log
实例中。目前,我必须手动登录到实例才能查看此文件,这很繁琐且不可扩展。
如何将此日志记录流式传输到外部目的地?我想使用ELK堆栈,但我的日志记录解决方案的具体细节可能不如弄清楚如何重定向cloud-init
日志记录那么重要。
解决方案
我想出了几种方法。
使用 Logstash 直接流式传输日志
这样,您需要在您的 EC2 实例上安装 Logstash。但是您可以将日志流式传输到您想要的任何地方,例如 Amazon ES、ElasticCloud 或您自己的 ElasticSearch 主机。
- 安装 Logstash
- 这可以通过编写脚本
UserData
或创建安装了 Logstash 的自定义 AMI 来完成。 - Logstash 可通过二进制文件、包管理器和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。
- 可以在此页面的日志部分中找到配置。
- 一定要
/var/log/cloud-init-output.log
在file_path
现场设置。
- 在 CloudWatch Logs 中创建 ElasticSearch 订阅过滤器。
- 见这里。
当然存档的方法有很多,这两种比较简单。
推荐阅读
- java - 从 catch 块中抛出多个异常的最佳方法
- javascript - 如何同时使用 bootstrap js 和 jquery-ui js?
- c - 我们有什么方法可以检索在 ubuntu 中处于可运行状态(非运行状态)的进程和线程列表?
- arrays - 如何从数组数组中删除特定的json对象
- angular - 如何自定义特定垫子徽章的颜色?
- netbeans - 在 Netbeans 11.1 中使用 Gluon 移动设备
- javascript - 将嵌套数组元素转换为字符串数组
- ios - swiftUI:登录完成后导航到主屏幕。通过按钮单击导航视图
- python - python regex) 模式 '\d-\d' 和字符串 '1-4-1'
- c# - 如何将 Unity 脚本应用于多个图层?