使用场景
主要还是给开发人员“打捞日志”用的。
ELK 是由三个开源工具组成的套件(Elasticsearch、Logstash 和 Kibana),主要用于日志的收集、分析和可视化。以下是 ELK 常见的使用场景:
日志集中化管理
收集来自多个服务器或服务的日志,集中存储在 Elasticsearch 中。
开发人员可以通过 Kibana 快速查找和分析日志,用于排查问题。
实时日志分析
通过 Logstash 或 Filebeat 收集实时日志数据,并进行结构化处理。
利用 Elasticsearch 提供强大的搜索能力,快速检索特定的日志信息。
监控与告警
可以结合其他工具(如 Metricbeat)监控系统性能指标。
实现对异常行为或错误日志的实时告警。
安全审计与合规性检查
记录并分析用户访问、操作等行为日志,满足安全审计需求。
追踪潜在的安全威胁或非法活动。
业务数据分析
不仅限于技术日志,还可以用来分析业务数据,例如用户行为、点击流数据等。
开发调试支持
确实,ELK 被广泛用于开发人员“打捞”日志,帮助定位生产环境中的问题。
结合时间戳、请求 ID、用户 ID 等信息,可以快速找到特定请求链路的日志。
总结: ELK 并不只是为开发人员“打捞日志”而设计,但它的确是一个非常强大的工具,能够帮助开发、运维以及安全团队更好地理解和利用日志数据。
什么规模和需求需要部署ELK
应考虑部署 ELK 的典型场景包括:
服务器数量 ≥ 3 台
每天日志总量 ≥ 1GB
需要跨服务、跨时间点的日志关联查询
需要实时监控、告警、可视化
有开发排查、运维巡检、安全审计等多角色协作需求
如果你目前只是几个小型项目,日志量不大,也可以先使用轻量级方案(如 Filebeat + Elasticsearch 单节点),逐步过渡到完整 ELK 架构。
docker部署http版
docker部署 http版 这个版本基本上不需要踩坑,适合开发测试环境搭建
Dockerfile
version: '3.7'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.3
container_name: elasticsearch
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms1g -Xmx1g
- xpack.security.enabled=false
- TZ=Asia/Shanghai
ports:
- "9200:9200"
- "9300:9300"
volumes:
- es_data:/usr/share/elasticsearch/data
networks:
- elk
logstash:
image: docker.elastic.co/logstash/logstash:8.11.3
container_name: logstash
depends_on:
- elasticsearch
ports:
- "5044:5044" # Beats 输入
- "9600:9600" # 监控端口
environment:
- LOGSTASH_KEYSTORE_PASSWORD=secret
- TZ=Asia/Shanghai
volumes:
- ./logstash/pipeline:/usr/share/logstash/pipeline
#- ./logstash/config:/usr/share/logstash/config
networks:
- elk
kibana:
image: docker.elastic.co/kibana/kibana:8.11.3
container_name: kibana
depends_on:
- elasticsearch
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
- TZ=Asia/Shanghai
networks:
- elk
networks:
elk:
volumes:
es_data:
用到的文件
./logstash/pipeline/main.conf
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} $$%{DATA:thread}$$ %{LOGLEVEL:level} %{JAVACLASS:logger} - %{GREEDYDATA:message}" }
}
date {
match => [ "timestamp", "yyyy-MM-dd HH:mm:ss" ]
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "app-logs-%{+YYYY.MM.dd}"
}
}
logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
测试访问
elasticsearch:
http://ip:9200/
logstash:
http://ip:9600/
kibana:
http://ip:5601/
docker部署https版
docker部署 https版 这个版本需要解决证书问题,授权账号问题 适合生产环境
Dockerfile
version: '3.7'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.3
container_name: elasticsearch
hostname: elasticsearch
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms1g -Xmx1g
- xpack.security.enabled=false
- TZ=Asia/Shanghai
ports:
- "9200:9200"
- "9300:9300"
volumes:
- es_data:/usr/share/elasticsearch/data
networks:
- elk
logstash:
image: docker.elastic.co/logstash/logstash:8.11.3
container_name: logstash
depends_on:
- elasticsearch
ports:
- "5044:5044" # Beats 输入
- "9600:9600" # 监控端口
environment:
- LOGSTASH_KEYSTORE_PASSWORD=secret
- TZ=Asia/Shanghai
volumes:
- ./logstash/pipeline:/usr/share/logstash/pipeline
#- ./logstash/config:/usr/share/logstash/config
networks:
- elk
kibana:
image: docker.elastic.co/kibana/kibana:8.11.3
container_name: kibana
depends_on:
- elasticsearch
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=https://elasticsearch:9200
- TZ=Asia/Shanghai
networks:
- elk
networks:
elk:
volumes:
es_data:
用到的文件
./logstash/pipeline/main.conf
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} $$%{DATA:thread}$$ %{LOGLEVEL:level} %{JAVACLASS:logger} - %{GREEDYDATA:message}" }
}
date {
match => [ "timestamp", "yyyy-MM-dd HH:mm:ss" ]
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "app-logs-%{+YYYY.MM.dd}"
}
}
./logstash/pipeline/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "https://elasticsearch:9200" ]
测试访问
elasticsearch:
https://ip:9200/ 账号elastic 密码通过下面命令设置 注意这里是https
logstash:
http://ip:9600/
kibana:
http://ip:5601/ 账号 kibana 密码通过下面命令设置
先设置elasticsearch密码
docker exec -u 0 -it elasticsearch /bin/bash
cd /usr/share/elasticsearch/bin
elasticsearch-setup-passwords interactive
早期版本授权
早期的版本是需要输入 elasticsearch的token和kibana的六位授权码
elasticsearch令牌生成
docker exec -it elasticsearch bash
cd /usr/share/elasticsearch/bin
elasticsearch-create-enrollment-token --scope kibana
生成token
eyJ2ZXIiOiI4LjExLjMiLCJhZHIiOlsiMTcyLjIxLjAuMjo5MjAwIl0sImZnciI6Ijg1ODI4ZWJjZTQzOWQzMzJhZDkzODg5YzRkMTQ4Y2RhZWFmYzQyYmY1ZmM0MDgyN2E2YWEzNmI3MzliYWVlNWQiLCJrZXkiOiJmOXlwNjVZQklPWHhvUF9pNWF1UTpTZHpoczFDZFNqQ0ZVMmZ5M1B4aTN3In0=
kibana的六位授权码获取
docker exec -it kibana bash
cd /usr/share/kibana/bin
./kibana-verification-code
(实际上执行 docker logs kibana 也能看到)
最新版本授权
先解决自签证书问题
elasticsearch的ca证书导入到kibana并配置
docker cp elasticsearch:/usr/share/elasticsearch/config/certs/http_ca.crt .
docker cp http_ca.crt kibana:/usr/share/kibana/config/certs/
kibana的yaml文件(/usr/share/kibana/config/kibana.yml)配置 添加
elasticsearch.ssl.certificateAuthorities: "/usr/share/kibana/config/certs/http_ca.crt"
再解决elasticsearch的授权问题
添加后还报错,需要解决kibana访问elasticsearch的授权问题
[2025-05-20T14:29:50.568+08:00][ERROR][elasticsearch-service] Unable to retrieve version information from Elasticsearch nodes. security_exception
Root causes:
security_exception: missing authentication credentials for REST request [/_nodes?filter_path=nodes.*.version%2Cnodes.*.http.publish_address%2Cnodes.*.ip]
[2025-05-20T14:29:59.072+08:00][INFO ][plugins.screenshotting.chromium] Browser executable: /usr/share/kibana/node_modules/@kbn/screenshotting-plugin/chromium/headless_shell-linux_x64/headless_shell
解决方法 进 elasticsearch 重置 kibana_system密码,然后配置到kibana.yml
重置kibana_system密码
docker exec -it elasticsearch bash
cd /usr/share/elasticsearch/bin
elasticsearch-reset-password -u kibana_system --interactive
kibana_system添加
# 安全认证配置
elasticsearch.username: "kibana_system"
elasticsearch.password: "password"
重置后访问 http://ip:5601/
不能用kibana_system账号,重置elastic密码用elastic登录,或者用kibana账号登录