ELK 分布式日志
Elasticsearch 基于 Java,是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Kibana 基于 NodeJs,也是一个开源和免费的工具,Kibana 可以为 Logstash 和 ElasticSearch 提供的日志分析友好的Web 界面,可以汇总、分析和搜索重要数据日志。
Logstash 基于 Java,是一个开源的用于收集,分析和存储日志的工具。
一、Docker 搭建ELK
1.1、安装 ELK
这里使用 docker-compose 编排安装 ELK 服务,以下镜像采用 cpu架构 arm64 版本,如需在x86环境下,请自行更换镜像。
version: '3'
services:
es:
container_name: blog-es
image: 'gagara/elasticsearch-oss-arm64:latest'
#restart: always
privileged: false
environment:
- "cluster.name=elasticsearch" #设置集群名称为elasticsearch
- "discovery.type=single-node" #以单一节点模式启动
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置使用jvm内存大小
volumes:
- ./es/plugins:/usr/share/elasticsearch/plugins
- ./es/data:/usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
networks:
- blog-nextwork
kibana:
image: 'gagara/kibana-oss-arm64:latest'
container_name: blog-kibana
#restart: always
depends_on:
- es #kibana在elasticsearch启动之后再启动
environment:
- "ELASTICSEARCH_HOSTS=http://es:9200"
ports:
- 5601:5601
networks:
- blog-nextwork
logstash:
image: 'gagara/logstash-oss-arm64:latest'
container_name: blog-logstash
#restart: always
environment:
- TZ=Asia/Shanghai
volumes:
- ./logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件
depends_on:
- es #logstash在elasticsearch启动之后再启动
ports:
- 4560:4560
- 5044:5044
networks:
- blog-nextwork
networks:
blog-nextwork:
driver: bridge
1.2、Logstash 配置文件简单了解
1.2.1、配置文件分为以下三个部分
# 输入模块,负责从数据源提取数据
input {
...
}
# 过滤器模块,负责通过配置插件来解析、处理日志数据
filter {
...
}
# 输出模块,负责输出数据到指定端,如ES
output {
...
}
1.2.2、 input 插件配置
input plugins 让 logstash 可以读取特定的事件源。例如 beats input 插件
input {
beats {
host => "0.0.0.0" #要监听的ip地址
port => 5044 #要监听的端口
#ssl => false # 是否启用https 传输
#ssl_certificate_authorities => ''
#ssl_certificate => ''
#ssl_key => ''
}
}
1.2.3、filter plugin
filter plugin 过滤器插件,对事件执行中间处理,以下是简单使用
filter {
mutate {
# 使用 | 分割日志
split => {"message"=>"|"}
}
mutate {
#把分割出来的各个部分,分别写入对应的字段中
add_field => {
"date_time" => "%{[message][0]}"
"appName" => "%{[message][1]}"
"tlog_flag" => "%{[message][2]}"
"log_level" => "%{[message][4]}"
}
}
mutate {
# 删除多余字段
remove_field => [ "host" ,"ecs"]
}
}
1.2.4、output plugin
output plugin 输出插件,将事件发送到特定目标。以下以elasticsearch为例
output {
#控制台输出 调试时使用
stdout {
codec => rubydebug
}
# 来自blog-cloud 的日志写入 blog_cloud_%{+YYYY.MM.dd} 索引中
if [fields][from] == 'blog-cloud' {
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "blog_cloud_%{+YYYY.MM.dd}"
}
}
}
1.2.5、logstash 完整配置
input {
beats {
port => 5044
}
}
#filter {
# mutate {
# # 使用 | 分割日志
# split => {"message"=>"|"}
# }
# mutate {
# #把分割出来的各个部分,分别写入对应的字段中
# add_field => {
# "date_time" => "%{[message][0]}"
# "appName" => "%{[message][1]}"
# "tlog_flag" => "%{[message][2]}"
# "log_level" => "%{[message][4]}"
# }
# }
# mutate {
# remove_field => [ "host" ,"ecs"]
# }
#}
output {
#控制台输出 调试时使用
stdout {
codec => rubydebug
}
# 来自blog-cloud 的日志写入 blog_cloud_%{+YYYY.MM.dd} 索引中
if [fields][from] == 'blog-cloud' {
elasticsearch {
hosts => ["es:9200"]
index => "blog_cloud_%{+YYYY.MM.dd}"
}
}
}
1.3、安裝Filebeat
在需要采集的服务器上安装 Filebeat
1.3.1、docker 安装
version: '3'
services:
filebeat:
image: 'docker.elastic.co/beats/filebeat:7.6.2'
#restart: always
environment:
- TZ=Asia/Shanghai
volumes:
- ./filebeat/filebeat.yml/usr/share/filebeat/filebeat.yml
- /home/hdj/IdeaProjects/blog-cloud/logs:/var/log/blog #监听的日志路径
1.3.2、filebeat 配置
# 数据处理,如果我们的数据不存在唯一主键,则使用fingerprint否则可以使用add_id来实现
processors:
# 指纹,防止同一条数据在output的es中存在多次。
#(此处为了演示使用message字段做指纹,实际情况应该根据不用的业务来选择不同的字段)
- fingerprint:
fields: ["message"]
ignore_missing: false
target_field: "@metadata._id"
method: "SHA256"
# 输入配置
filebeat.inputs:
- type: log
enabled: true
encoding: utf-8
# 容器内的路径,注意映射
# 映射宿路径: /home/hdj/IdeaProjects/blog-cloud/logs:/var/log/blog
paths:
# 抓取日志路径
- /var/log/blog/*/blog_*.log
# 添加自定义字段
fields:
from: 'blog-cloud'
multiline:
# 正则表达式
pattern: "^[[:space:]]+(at|\\.{3})[[:space:]]+\\b|^Caused by:"
# 是否开启正则匹配,true:开启,false:不开启
negate: false
# 不匹配正则的行是放到匹配到正则的行的after(后面)还是before(前面)
match: after
# 多行日志结束的时间,多长时间没接收到日志,如果上一个是多行日志,则认为上一个结束了
timeout: 5s
# 输出到 logstash
output.logstash:
hosts: ["192.168.43.178:5044"]
二、安全校验配置
参考
- http://doc.ruoyi.vip/ruoyi-cloud/cloud/elk.html
- https://tlog.yomahub.com/docs/
- https://www.elastic.co/guide/en/beats/filebeat/7.15/filebeat-reference-yml.html
- https://juejin.cn/post/6963157280644661278
- https://www.elastic.co/guide/en/logstash/6.7/event-dependent-configuration.html#conditionals
- https://www.cnblogs.com/-hing-/p/14716639.html