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-esimage: 'gagara/elasticsearch-oss-arm64:latest'#restart: alwaysprivileged: falseenvironment:- "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/dataports:- 9200:9200- 9300:9300networks:- blog-nextworkkibana:image: 'gagara/kibana-oss-arm64:latest'container_name: blog-kibana#restart: alwaysdepends_on:- es #kibana在elasticsearch启动之后再启动environment:- "ELASTICSEARCH_HOSTS=http://es:9200"ports:- 5601:5601networks:- blog-nextworklogstash:image: 'gagara/logstash-oss-arm64:latest'container_name: blog-logstash#restart: alwaysenvironment:- TZ=Asia/Shanghaivolumes:- ./logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件depends_on:- es #logstash在elasticsearch启动之后再启动ports:- 4560:4560- 5044:5044networks:- blog-nextworknetworks:blog-nextwork:driver: bridge
1.2、Logstash 配置文件简单了解
1.2.1、配置文件分为以下三个部分
# 输入模块,负责从数据源提取数据input {...}# 过滤器模块,负责通过配置插件来解析、处理日志数据filter {...}# 输出模块,负责输出数据到指定端,如ESoutput {...}
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: alwaysenvironment:- TZ=Asia/Shanghaivolumes:- ./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: falsetarget_field: "@metadata._id"method: "SHA256"# 输入配置filebeat.inputs:- type: logenabled: trueencoding: utf-8# 容器内的路径,注意映射# 映射宿路径: /home/hdj/IdeaProjects/blog-cloud/logs:/var/log/blogpaths:# 抓取日志路径- /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# 输出到 logstashoutput.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
