Skip to content

Hướng dẫn cài đặt ELK stack

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

Sử dụng docker

  • Project structure
.
├── 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
1
2
3
4
5
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

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.

Dockerfile
FROM 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"]

Logstash

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...

Dockerfile
FROM docker.elastic.co/logstash/logstash:8.14.3
logstash.yml
1
2
3
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

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.

Dockerfile
FROM docker.elastic.co/elasticsearch/elasticsearch:8.14.3
elasticsearch.yml
1
2
3
4
5
---
cluster.name: docker-cluster
network.host: 0.0.0.0
xpack.license.self_generated.type: basic
xpack.security.enabled: false

Kibana

Dockerfile
FROM 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.