ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。
version: '3.4'
services:
elasticsearch:
image: "docker.elastic.co/elasticsearch/elasticsearch:${ES_VERSION}"
environment:
# 将ES的集群发现模式配置为单节点模式
- discovery.type=single-node
volumes:
# Docker容器中时间和宿主机同步
- /etc/localtime:/etc/localtime
# 将ES的数据映射并持久化至宿主机中
- ./docker_es/data:/usr/share/elasticsearch/data
ports:
- "9200:9200"
- "9300:9300"
logstash:
depends_on:
- elasticsearch
image: "docker.elastic.co/logstash/logstash:${ES_VERSION}"
volumes:
# logstash 配置
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
ports:
- "5044:5044"
links:
- elasticsearch
kibana:
depends_on:
- elasticsearch
image: "docker.elastic.co/kibana/kibana:${ES_VERSION}"
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200
volumes:
# Docker容器中时间和宿主机同步
- /etc/localtime:/etc/localtime
ports:
- "5601:5601"
links:
- elasticsearch
filebeat:
depends_on:
- elasticsearch
- logstash
image: "docker.elastic.co/beats/filebeat:${ES_VERSION}"
user: root # 必须为root,否则会因为无权限而无法启动
environment:
- strict.perms=false
volumes:
# filebeat 配置文件
- ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
# 映射到容器中[作为数据源]
- ./docker_es/filebeat/logs:/usr/share/filebeat/logs:rw
# 这里存储 filebeat 的状态 如果缺少状态每次重启 filebeat 都会拉去全量匹配的日志
- ./docker_es/filebeat/data:/usr/share/filebeat/data:rw
# 将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
links:
- logstash
ES_VERSION=7.1.0 # 设置 docker-compose 的环境变量
filebeat.inputs:
# 输入filebeat的类型,包括log(具体路径的日志),stdin(键盘输入),redis,udp,docker,tcp,syslog,可以同时配置多个(包括相同类型的)
# 具体的每种类型的配置信息可以通过官网:https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html 了解
- type: log
# 配置是否生效
enabled: true
paths:
# 容器中目录下的所有.log文件
- /usr/share/filebeat/logs/*.log
# 额外添加的tag标签
tags: ["mylog"]
# 向输出的每一条日志添加额外的信息,比如“appname:xapp”,方便后续对日志进行分组统计。
# 默认情况下,会在输出信息的fields子目录下以指定的新增fields建立子目录,例如fields.appname
# 这个的意思就是会在es中多添加一个字段,格式为 "filelds":{"appname":"xapp"}
fields:
appname: "xapp"
# 加载 module 没有特殊需要无需调整
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
# 是否允许重新加载
reload.enabled: false
# 重新加载的时间间隔()
#reload.period: 10s
# Elasticsearch模板配置
setup.template.settings:
# 数据分片数
index.number_of_shards: 1
# 是否启用仪表盘
setup.dashboards.enabled: false
# kibana 配置
setup.kibana:
# kibana地址
host: "http://kibana:5601"
# 直接传输至ES
#output.elasticsearch:
# hosts: ["http://es-master:9200"]
# index: "filebeat-%{[beat.version]}-%{+yyyy.MM.dd}"
# 传输至LogStash
output.logstash:
hosts: ["logstash:5044"]
processors:
# 主机相关 信息
- add_host_metadata: ~
# 云服务器的元数据信息,包括阿里云ECS 腾讯云QCloud AWS的EC2的相关信息
- add_cloud_metadata: ~
input {
# 来源beats
beats {
# 端口
port => "5044"
}
}
filter {
json {
source => "message" # 从 message 解析
remove_field => "message" # 丢弃掉日志中的 message 字段
target => "logdata" # 将 json 解析出的数据 输出到 logdata 字段
}
date {
# 将 ts 的数据取出 通过 "UNIX_MS", "yyyy-MMM-dd'T'HH:mm:ss.SSS+0800", "ISO8601" 三种匹配模式 匹配数据
match => ["ts","UNIX_MS", "yyyy-MMM-dd'T'HH:mm:ss.SSS+0800", "ISO8601"]
remove_field => "ts" # 丢弃掉日志中的 ts 字段
}
}
output {
# 输出到 es
elasticsearch {
hosts => ["http://elasticsearch:9200"]
# 设置索引为 fields 字段 下的 appname 字段 拼上 日期 ( [fields][appname] 由 filebeat 传入,也可以在日志中加入 app_name 字段用于区分服务)
index => "%{[fields][appname]}-%{+YYYY-MM-dd}"
}
# 输出到命令行 用于debug
stdout { codec => rubydebug }
}
点击 Discover 查看日志
好好学习,天天向上