Môi trường thực hiện:
+ Centos 7 on GCE
+ 1 Core 4GB RAM
+ ELK 6.4.2 (vì mới có cờ rách X-pack bản này :D)
+ Cài đặt tất cả trên 1 server, không có cluster, không sử dụng Broker nào như Redis hay Kafka
Download:
+ Kibana: https://artifacts.elastic.co/downloads/logstash/logstash-6.4.2.rpm
+ Elasticsearch: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.2.rpm
+ Logstash: https://artifacts.elastic.co/downloads/logstash/logstash-6.4.2.deb
- Cài đặt
Bước 1: cài đặt Java jdk-8u181-linux-x64.rpm (search google download về)
Bước 2: Cài đặt các gói rpm của E – L – K
rpm -ivh elasticsearch-6.4.2.rpm kibana-6.4.2-x86_64.rpm logstash-6.4.2.rpm
Bước 3: Start các dịch vụ elasticsearch, logstash, kibana lên
systemctl start elasticsearch systemctl start kibana systemctl start logstash systemctl enable elasticsearch systemctl enable kibana systemctl enable logstash
Bước 4: Cài đặt Nginx để làm proxy cho Kibana:
yum install nginx
Tạo vhost cho nginx:
upstream kibana { server localhost:5601 weight=3 max_fails=3 fail_timeout=10s; least_conn; } server { listen 80; server_name logs.domain.com; access_log /var/log/nginx/kibana.access.log main; error_log /var/log/nginx/kibana.error.log; underscores_in_headers on; #Denied Google Index add_header X-Robots-Tag "noindex, nofollow, nosnippet, noarchive"; location / { proxy_pass http://kibana; proxy_send_timeout 30s; proxy_connect_timeout 30s; proxy_read_timeout 30s; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_buffering on; proxy_buffers 100 4k; proxy_buffer_size 128k; index index.html index.php; } gzip off; }
Start nginx và truy cập vào IP/domain của server
2. Cấu hình bảo mật và X-pack
Mặc định trong phiên bản Elasticsearch 6 đã có sẵn X-pack không cần cài thêm như các bản trước. Tuy nhiên nó bị tắt đi, để bật thì sửa file
nano /etc/elasticsearch/elasticsearch.yml
Thêm dòng
xpack.security.enabled: true
Restart elasticsearch
Đổi mật khẩu cho các user mặc định (Build-in users):
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
Sửa config Kibana để bật Secure và thêm đường dẫn Elasticsearch:
nano /etc/kibana/kibana.yml
Thêm các dòng sau:
xpack.security.enabled: true elasticsearch: url: "http://localhost:9200" preserveHost: true username: "elastic" password: "Pass-da-dat-o-buoc-tren"
Restart Kibana
Bây giờ đăng nhập vào Kibana cần phải có user/pass. Hãy sử dụng user elastic là superuser với pass bạn đã đặt ở bước trên.
3. Đẩy thử log lên ELK
Bước 1: dưới client
Ở đây mình đẩy log của Laravel lên cho dev có thể check mà không cần đòi vào server nữa
Đẩy log theo từng domain, mỗi domain là 1 Index Pattern cho dễ theo dõi và phân quyền view cho dev
Ở server log cần cài đặt Filebeat để đẩy log lên:
Download: https://www.elastic.co/downloads/beats/filebeat
Sửa file /etc/filebeat/filebeat.yml
##### filebeat.yml path.home: /usr/share/filebeat path.config: /etc/filebeat path.data: /var/lib/filebeat path.logs: /var/log/filebeat filebeat.registry_file: /var/lib/filebeat/registry filebeat.config.prospectors: enabled: true path: ${path.config}/conf.d/*.yml output.logstash: hosts: ["35.229.132.206:5055"] setup.template: enabled: false
Với 35.229.132.206:5055 là IP và port logstash của server ELK
Tạo file cho domain cần đẩy log (chia mỗi domain một file cấu hình riêng cho dễ quản lý) trong /etc/filebeat/conf.d/domain1.yml
- type: log enabled: true paths: - /data/www/domain.vn/storage/logs/*.log fields: domain: domain.vn log_type: php-framework fields_under_root: true exclude_files: ['worker.log$'] multiline: pattern: '^\[' negate: true match: after
Restart filebeat
Bước 2: trên server ELK
Tạo 1 file config cho logstash trong /etc/logstash/conf.d/php-framework.conf
input { beats { port => 5055 } } filter { if [log_type] == "php-framework" { grok { match => { "message" => "\[%{TIMESTAMP_ISO8601}\] %{DATA:env}\.%{DATA:severity}: %{GREEDYDATA:info}" } } mutate { remove_field => ["info"] remove_field => ["beat.name"] remove_field => ["host"] remove_field => ["tags"] remove_field => ["@version"] } } } output { elasticsearch { hosts => "localhost:9200" index => "%{domain}" manage_template => false } }
Lưu ý: php-framwork là name mình đặt cho loại log Laravel, ở dưới filebeat phải trùng với trên server để nó filter được đúng
Port 5055: trùng với port đã cấu hình ở filebeat
match => { "message" => "\[%{TIMESTAMP_ISO8601}\] %{DATA:env}\.%{DATA:severity}: %{GREEDYDATA:info}" }
Đây là grok để filter log, cụ thể ở đây mình chỉ filter ra time, ENV, severity của log
Restart logstash
Bước 3: Add Index trên Kibana để view log:
Đăng nhập vào Kibana > Management > Index Patterns
Gõ domain của log vào ô trên, nếu báo Success thì ngon luôn
Ở step kế tiếp chọn @timestamp để list theo time và Create index pattern

POST _template/default { "order" : -1, "index_patterns" : [ "*" ], "settings" : { "index" : { "number_of_shards" : "1", "number_of_replicas" : "0" } }, "mappings" : { }, "aliases" : { } }
Như vậy những index sau này đẩy lên sẽ không báo vàng nữa và chỉ có 1 shard
[…] Cài đặt ELK 6.x logs stack để đẩy log […]