Ruby 语言 实现 Docker 容器日志收集脚本 聚合多容器日志到 ELK

Ruby阿木 发布于 18 小时前 2 次阅读


Ruby Docker 容器日志收集脚本实现与 ELK 集成

随着容器技术的普及,Docker 已经成为现代软件开发和部署的重要工具。容器化应用具有轻量级、可移植性强等特点,但随之而来的是日志管理的复杂性。如何有效地收集、聚合和存储容器日志,对于运维人员来说是一个挑战。本文将介绍如何使用 Ruby 语言编写一个 Docker 容器日志收集脚本,并将其与 Elasticsearch、Logstash 和 Kibana(ELK)集成,实现日志的集中管理和分析。

环境准备

在开始编写脚本之前,我们需要确保以下环境已经搭建好:

1. Docker:用于运行容器。
2. Ruby:用于编写脚本。
3. Elasticsearch、Logstash 和 Kibana:用于存储、处理和分析日志。

以下是安装步骤:

bash
安装 Docker
sudo apt-get update
sudo apt-get install docker.io

安装 Ruby
sudo apt-get install ruby

安装 Elasticsearch、Logstash 和 Kibana
sudo apt-get install elasticsearch logstash kibana

Ruby 脚本编写

下面是一个简单的 Ruby 脚本,用于收集 Docker 容器的日志并输出到标准输出。

ruby
require 'docker'
require 'json'

连接到 Docker API
client = Docker::Client.new

获取所有容器的日志
client.containers.all.each do |container|
puts "Collecting logs from container: {container.id}"
container.logs(stream: false, follow: true).each do |log|
puts log
end
end

这个脚本使用了 Docker 的 Ruby 客户端库 `docker-api`,它允许我们轻松地与 Docker API 交互。脚本首先连接到 Docker API,然后遍历所有容器,并逐行输出它们的日志。

日志输出到 ELK

为了将日志输出到 ELK,我们需要修改脚本,使其能够将日志发送到 Logstash。以下是修改后的脚本:

ruby
require 'docker'
require 'json'
require 'net/http'

连接到 Docker API
client = Docker::Client.new

Logstash 输出地址
logstash_url = 'http://localhost:5044/beat'

获取所有容器的日志
client.containers.all.each do |container|
puts "Collecting logs from container: {container.id}"
container.logs(stream: false, follow: true).each do |log|
创建 JSON 格式的日志数据
log_data = { 'message' => log, 'container_id' => container.id }
json_data = log_data.to_json

发送日志到 Logstash
uri = URI(logstash_url)
req = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json')
req.body = json_data
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(req)
end

puts "Log sent to Logstash: {res.code}"
end
end

在这个脚本中,我们使用了 `net/http` 库来发送 HTTP POST 请求到 Logstash。我们首先将日志数据转换为 JSON 格式,然后将其发送到 Logstash 的输入端点。

集成测试

在完成脚本编写后,我们需要进行集成测试,确保日志能够正确地发送到 ELK。

1. 运行 Docker 容器并生成日志。
2. 运行 Ruby 脚本。
3. 在 Kibana 中查看日志数据。

以下是一个简单的测试脚本:

bash
运行一个测试容器
docker run -d --name test-container busybox top

运行日志收集脚本
ruby collect_logs_to_elk.rb

在 Kibana 中查看日志

在 Kibana 中,你可以通过访问 `http://localhost:5601/app/kibana` 来查看日志数据。确保你已经创建了相应的索引模式,以便 Kibana 能够正确地解析和展示日志。

总结

本文介绍了如何使用 Ruby 语言编写一个 Docker 容器日志收集脚本,并将其与 ELK 集成。通过这个脚本,我们可以轻松地收集、聚合和存储容器日志,从而实现日志的集中管理和分析。在实际应用中,你可以根据需求对脚本进行扩展和优化,例如添加日志过滤、格式化等功能。