ELK stack là bộ ba đi liền với nhau trong việc central log và visualization. Bài viết này hướng dẫn cài đặt ELK stack đơn giản
.
├── docker-compose.yml
├── .env
├── elasticsearch
│ ├── config
│ │ ├── elasticsearch.yml
│ │ └── log4j2.properties
│ └── Dockerfile
├── filebeat
│ ├── config
│ │ └── filebeat.yml
│ ├── Dockerfile
│ └── ingress
│ └── test.log
├── kibana
│ ├── config
│ │ └── kibana.yml
│ └── Dockerfile
└── logstash
├── config
│ └── logstash.yml
├── Dockerfile
└── pipeline
└── logstash.conf
Trong ví dụ này, filebeat
sẽ đọc các thay đổi từ test.log
, transform chúng theo rule được quy định tại filebeat.yml
, gửi tới logstash. Logstash sẽ transform một lần nữa (nếu có) và gửi chúng tới elasticsearch. Cuối cùng, kibana sẽ đọc data từ elasticsearch và tạo các chart.
docker-compose.yml |
---|
| version: '2.29.1'
services:
kibana:
build:
context: ./kibana
container_name: mykiba
volumes:
- ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml:ro,Z
ports:
- 5601:5601
environment:
KIBANA_SYSTEM_PASSWORD: ${KIBANA_SYSTEM_PASSWORD:-}
networks:
- elk
depends_on:
- elasticsearch
restart: unless-stopped
elasticsearch:
build:
context: ./elasticsearch
container_name: myes
volumes:
- ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro,Z
- ./elasticsearch/config/log4j2.properties:/usr/share/elasticsearch/config/log4j2.properties:ro,Z
- elasticsearch:/usr/share/elasticsearch/data:Z
ports:
- 9200:9200
- 9300:9300
environment:
node.name: elasticsearch
ES_JAVA_OPTS: -Xms512m -Xmx512m
ELASTIC_PASSWORD: ${ELASTIC_PASSWORD:-}
discovery.type: single-node
networks:
- elk
restart: unless-stopped
logstash:
build:
context: ./logstash
container_name: mylogs
volumes:
- ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro,Z
- ./logstash/pipeline:/usr/share/logstash/pipeline:ro,Z
ports:
- 5044:5044
- 50000:50000/tcp
- 50000:50000/udp
- 9600:9600
environment:
LS_JAVA_OPTS: -Xms256m -Xmx256m
LOGSTASH_INTERNAL_PASSWORD: ${LOGSTASH_INTERNAL_PASSWORD:-}
networks:
- elk
restart: unless-stopped
depends_on:
- elasticsearch
filebeat:
container_name: mybeat
hostname: filebeat
build:
context: ./filebeat
user: root
command:
- -e
- --strict.perms=false
volumes:
- ./filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro,Z
- ./filebeat/ingress:/var/log/logify/
environment:
FILEBEAT_INTERNAL_PASSWORD: ${FILEBEAT_INTERNAL_PASSWORD:-}
BEATS_SYSTEM_PASSWORD: ${BEATS_SYSTEM_PASSWORD:-}
networks:
- elk
networks:
elk:
driver: bridge
volumes:
elasticsearch:
|
Cài đặt các biến
.env |
---|
| FILEBEAT_INTERNAL_PASSWORD='your_file_beat_pass'
BEATS_SYSTEM_PASSWORD='your_file_beat_pass'
LOGSTASH_INTERNAL_PASSWORD='your_file_beat_pass'
ELASTIC_PASSWORD='your_file_beat_pass'
KIBANA_SYSTEM_PASSWORD='your_file_beat_pass'
|
Filebeat là yếu tố đầu tiên ta cần quan tâm. Do nó là yếu tố đầu tiên làm việc với log file. Sử dụng các rule transform cần thiết để parse log theo nhu cầu. Trước khi chuyển log sang logstash, nên in chung chúng ra màn hình trước để quan sát các thay đổi.
DockerfileFROM docker.elastic.co/beats/filebeat:8.14.3
filebeat.yml |
---|
| logging.level: error
filebeat.inputs:
- type: log
paths:
- /var/log/logify/test.log
scan_frequency: 5s
processors:
- dissect:
tokenizer: "%{event_time} %{+event_time} %{log_level} %{component}: allowed=%{allowed}\tugi=%{user}@%{realm} (auth:%{auth})\tip=/%{source_ip}\tcmd=%{command}\tsrc=%{source_path}\tdst=%{dst}\tperm=%{owner}:%{group}:%{permission}\tproto=%{proto}\tcallerContext=%{caller_context}"
field: "message"
target_prefix: "data"
trim_values: "all"
trim_chars: " \t"
ignore_failure: true
- drop_fields:
fields: ["log.flags"]
- drop_fields:
fields: ["message","agent","ecs","input","parse"]
# This output for print on console
output.console:
pretty: true
# Comment above and uncomment bellow to output to logstash
# output.logstash:
# hosts: ["logstash:5044"]
|
Sau khi đã parse log thành công như ý muốn, ta chuyển nó đến logstash để transform một lần nữa (nếu có). Từ logstash, ta không chỉ có thể chuyển data tới elasticsearch mà còn nhiều ứng dụng khác như Kafka...
DockerfileFROM docker.elastic.co/logstash/logstash:8.14.3
logstash.yml |
---|
| http.host: 0.0.0.0
node.name: logstash
|
logstash.conf |
---|
| input {
beats {
port => 5044
}
tcp {
port => 50000
}
}
filter {
mutate {
rename => { "data" => "message" }
}
}
output {
elasticsearch {
index => "filebeat"
hosts => "elasticsearch:9200"
user => "logstash_internal"
password => "${LOGSTASH_INTERNAL_PASSWORD}"
}
}
|
Elasticsearch là trái tim của mô hình, cần start nó lên trước khi start các ứng dụng khác.
DockerfileFROM docker.elastic.co/elasticsearch/elasticsearch:8.14.3
elasticsearch.yml |
---|
| ---
cluster.name: docker-cluster
network.host: 0.0.0.0
xpack.license.self_generated.type: basic
xpack.security.enabled: false
|
DockerfileFROM docker.elastic.co/kibana/kibana:8.14.3
kibana.yml |
---|
| ---
server.name: kibana
server.host: 0.0.0.0
elasticsearch.hosts: [ http://elasticsearch:9200 ]
monitoring.ui.container.elasticsearch.enabled: true
monitoring.ui.container.logstash.enabled: true
elasticsearch.username: kibana_system
elasticsearch.password: ${KIBANA_SYSTEM_PASSWORD}
|
Tới đây, ta chỉ cần run docker compose up --build
để chạy tất cả các container. Khi thành công, các bạn truy cập http://localhost:5601
để vào giao diện kibana và cấu hình các dashboard cần thiết.