Thiết lập ELK quản lý log với Rails app
Bài đăng này đã không được cập nhật trong 5 năm
Giới thiệu về ELK
Lưu trữ log, quản lý log là một trong những phần thiết yếu trong mọi thiết lập vì log cực kỳ hữu ích khi khắc phục sự cố xảy ra với ứng dụng của bạn. Hôm nay, tôi sẽ giới thiệu một bộ công cụ mã nguồn mở giúp thu thập và quản lý log trực tiếp trên Rails app. Đó là ELK (Elasticsearch, Logstash và Kibana). ELK là một log server và giao diện web quản lý log, bao gồm Elasticsearch (là một công cụ tìm kiếm và phân tích toàn văn bản mã nguồn mở, dựa trên công cụ tìm kiếm Apache Lucene), Logstash (là một trình tổng hợp log thu thập dữ liệu từ nhiều nguồn đầu vào khác nhau, thực hiện các biến đổi và cải tiến khác nhau và sau đó gửi nó đến Elaticsearch) và Kibana (là một công cụ quản lý và trực quan hóa dữ liệu cho Elaticsearch cung cấp biểu đồ thời gian thực, biểu đồ đường, biểu đồ hình tròn và bản đồ). Và cũng không kém quần quan trọng là Beats (cụ thể là filebeat beats-pattern giúp vận chuyển các log từ client về server).
ELK phổ biến vì nó đáp ứng nhu cầu trong việc phân tích và quản lý log, là một nền tảng phân tích đơn giản nhưng vô cùng mạnh mẽ.
Cách sử dụng ELK để quản lý log
Các thành phần khác nhau trong ELK được thiết kế để tương tác với nhau mà không cần cấu hình quá nhiều. Đối với môi trường phát triển quy mô nhỏ, kiến trúc cổ điển sẽ như sau:
Tuy nhiên, để xử lý các đường ống phức tạp hơn được xây dựng để xử lý một lượng lớn dữ liệu trong sản xuất, các thành phần bổ sung có thể sẽ được thêm vào kiến trúc ghi log của bạn, để phục hồi (Redis) và bảo mật (Nginx):
Cài đặt ELK
ELK có thể được cài đặt bằng nhiều phương pháp khác nhau và trên một loạt các hệ điều hành và môi trường khác nhau. Tôi sẽ cung cấp một ví dụ để cài đặt tất cả các thành phần Elaticsearch, Logstash, Kibana và Filebeat - trên Linux.
Cài đặt Elasticsearch
Tải xuống và cài đặt khóa ký công khai:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
Đối với Debian, sau đó chúng ta cần cài đặt gói apt-transport-https:
sudo apt-get install apt-transport-https
Lưu kho lưu trữ vào /etc/apt/sources.list.d/elastic-7.x.list:
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
Cuối cùng là cập nhật kho lưu trữ và cài đặt Elasticsearch
sudo apt-get update && sudo apt-get install elasticsearch
Sau khi cài đặt xong, chạy Elasticsearch bằng lệnh:
sudo service elasticsearch start
Để xác nhận rằng mọi thứ đều hoạt động như mong đợi, hãy chạy curl hoặc truy cập trình duyệt của bạn tới http://localhost:9200 và bạn sẽ thấy:
{
"name" : "hoanghung",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "qeYhHeRdSNCPWX0AFEeEpQ",
"version" : {
"number" : "7.4.0",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "22e1767283e61a198cb4db791ea66e3f11ab9910",
"build_date" : "2019-09-27T08:36:48.569419Z",
"build_snapshot" : false,
"lucene_version" : "8.2.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
Cài đặt Logstash
Logstash yêu cầu Java 8 hoặc Java 11 để chạy, vì vậy tôi sẽ bắt đầu quá trình thiết lập Logstash với việc cài đặt Java:
sudo apt-get install default-jre
Xác minh java đã được cài đặt:
java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~18.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
Vì tôi đã xác định kho lưu trữ trong hệ thống, tất cả những gì chúng tôi phải làm để cài đặt Logstash là chạy:
sudo apt-get install logstash
Tôi sẽ quay lại chạy Logstash sau khi cài đặt và chạy Kibana
Cài đặt Kibana
Bạn có thể cài đặt Kibana với câu lệnh:
sudo apt-get update && sudo apt-get install kibana
Bây giờ, bắt đầu Kibana với:
sudo service kibana start
Cài đặt Filebeat
Cài đặt Filebeat với các câu lệnh:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.4.0-amd64.deb
sudo dpkg -i filebeat-7.4.0-amd64.deb
Khởi chạy Filebeat và sau đó là Logstash mà tôi đã cài đặt trước đó:
sudo systemctl start filebeat
sudo systemctl start logstash
Xác nhận là Kibana, Logstash, Filebeat của bạn đã chạy thành công với các câu lệnh:
sudo systemctl status kibana
sudo systemctl status logstash
sudo systemctl status filebeat
Đèn báo xanh là bạn đã chạy thành công. Ví dụ:
● kibana.service - Kibana
Loaded: loaded (/etc/systemd/system/kibana.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2019-10-17 21:15:41 +07; 1h 55min ago
Main PID: 5073 (node)
Tasks: 21 (limit: 4915)
CGroup: /system.slice/kibana.service
└─5073 /usr/share/kibana/bin/../node/bin/node /usr/share/kibana/bin/../src/cli -c /etc/kibana/kibana.yml
Thg 10 17 21:20:23 hoanghung kibana[5073]: {"type":"response","@timestamp":"2019-10-17T14:20:23Z","tags":[],"pid":5073,"method":"get","statusCod
Thg 10 17 21:20:23 hoanghung kibana[5073]: {"type":"response","@timestamp":"2019-10-17T14:20:23Z","tags":[],"pid":5073,"method":"post","statusCo
Thg 10 17 21:20:23 hoanghung kibana[5073]: {"type":"response","@timestamp":"2019-10-17T14:20:23Z","tags":[],"pid":5073,"method":"get","statusCod
Thg 10 17 21:20:23 hoanghung kibana[5073]: {"type":"response","@timestamp":"2019-10-17T14:20:23Z","tags":[],"pid":5073,"method":"put","statusCod
Thg 10 17 21:20:32 hoanghung kibana[5073]: {"type":"response","@timestamp":"2019-10-17T14:20:32Z","tags":[],"pid":5073,"method":"get","statusCod
Thg 10 17 21:20:33 hoanghung kibana[5073]: {"type":"response","@timestamp":"2019-10-17T14:20:32Z","tags":[],"pid":5073,"method":"get","statusCod
Thg 10 17 21:20:33 hoanghung kibana[5073]: {"type":"response","@timestamp":"2019-10-17T14:20:33Z","tags":[],"pid":5073,"method":"post","statusCo
Thg 10 17 21:20:35 hoanghung kibana[5073]: {"type":"response","@timestamp":"2019-10-17T14:20:35Z","tags":[],"pid":5073,"method":"get","statusCod
Thg 10 17 21:20:36 hoanghung kibana[5073]: {"type":"response","@timestamp":"2019-10-17T14:20:36Z","tags":[],"pid":5073,"method":"post","statusCo
Thg 10 17 21:20:37 hoanghung kibana[5073]: {"type":"response","@timestamp":"2019-10-17T14:20:37Z","tags":[],"pid":5073,"method":"get","statusCod
Cấu hình với Rails app
Tiếp theo chúng mình sẽ tiến hành config elk với rails app để hiển thị log trên Kibana thông qua Logstash và gem logstash-logger
Cấu hình Logstash
Cấu hình cho Logstash trong chuỗi xử lý log tương ứng với 3 modules:
- Input: tiếp nhận/thu thập dữ liệu log ở dạng thô từ nhiều nguồn khác nhau (filebeat, redis, syslog, ...).
- Filter: sau khi tiếp nhận dữ liệu sẽ tiến hành xử lý (thêm, sửa, xóa) để xây dựng cấu trúc log event như mong muốn.
- Output: sau cùng là chuyển tiếp dữ liệu log event về cho Elasticsearch tiếp nhận lưu trữ log hoặc hiển thị log với Kibana.
$ cd /etc/logstash/conf.d
$ sudo touch 01-rails-development.conf 02-beats-input.conf 10-syslog-filter.conf 30-elasticsearch-output.conf
Tôi đang làm trên app mẫu của tôi có tên là r-oe17-p2-park-booking và tôi đặt nội dung của các file cấu hình như sau:
- 01-rails-development.conf
input {
file {
path => "/home/hoanghung/r-oe17-p2-park-booking/log/development.log"
type => "rails"
codec => json {
charset => "UTF-8"
}
}
}
filter {
ruby {
init => "require 'digest/sha1'; require 'json'"
code => "event['fingerprint'] = Digest::SHA1.hexdigest event.to_json"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
document_id => "%{fingerprint}"
index => "logstash-%{type}-%{+YYYY.MM.dd}"
}
}
- 02-beats-input.conf
input {
beats {
port => 5044
}
}
- 10-syslog-filter.conf
filter {
if [type] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
syslog_pri { }
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
- 30-elasticsearch-output.conf
output {
elasticsearch {
hosts => ["localhost:9200"]
sniffing => true
manage_template => false
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
Cấu hình Rails
Thêm gem "logstash-logger" vào Gemfile và chạy bundle install. Tại file environments/development.rb tôi thêm:
config.logstash.type = :file
config.logstash.path = "log/development.log"
Sau đó tôi restart lại Logstash:
$ sudo service logstash restart
Khởi động Rails app và Kibana
Mở Kibana trong trình duyệt của bạn với: http://localhost:5601. Bạn sẽ thấy giao diện trang chủ Kibana:
Khởi động Rails app và quay lại Kibana, bạn sẽ quan sát thấy log đã được hiển thị ở tab Discover:
Kết luận
Trên đây là bài viết cài đặt và cấu hình ELK (Elasticsearch - Logstash - Kibana) với ứng dụng Rails mà tôi đã tìm hiểu được. Bạn có thể tìm hiểu sâu hơn về ELK tại đây Tham khảo từ: https://logz.io/learn/complete-guide-elk-stack/#intro
All rights reserved