微服务日志系统建设
1 )为什么需要日志系统
- 业务发展越来越庞大,服务器越来越多
- 各种访问日志,应用日志,错误日志量越来越多,无法管理
- 开发人员排查问题,需要到服务器上查日志
2 )Elastic Stack
- 它是 Elasticsearch, Logstash, Kibana, +Beats 组成的
- Elasticsearch 是分布式搜索引擎,提供搜集,分析,存储数据三大功能
- Logstash: 主要是用来日志的搜集,分析,过滤日志的工具
- Kibana:提供友好的Web界面,可以汇总,分析和搜索数据
- Beats: 是一个轻量级的日志收集处理工具 (Agent)
3 )Beats 的六种主要工具
- Packetbeat: 网络数据(收集网络流量数据)
- Metricbeat: 指标 (收集系统,进程和文件系统级别的数据)
- Filebeat: 日志文件 (收集文件数据)
- Winlogbeat: windows事件日志(收集Windows事件日志数据)
- Auditbeat: 审计数据 (收集审计日志)
- Heartbeat: 运行时间监控 (收集系统运行时的数据)
4 )ELK 系统的特点
- 强大的收集能力:能够采集多种来源的日志数据
- 稳定的传输能力: 能够把日志数据传输到中央系统
- 分布式存储:可根据业务需求存储日志数据,可动态扩容
- 分析&展示&提醒: 具备数据分析能力,数据展示能力和告警能力
5 )ELK 架构图
- Fliebeat放到了一台机器上去,不同的机器
- 不同的机器也可以放不同的Filebeat
- Filebeat 即能直接传输到 Es 中去
- 也可以通过 Logstash 处理完再传输到 Es 中
- ES 负责存储我们的数据,也负责提供一些复杂的搜索
- 通过存储和提供一些搜索能力,Kibana 可以通过Es的数据可以多维度的展示数据
- 如果 Filebeat 和 es 中间压力比较大,还可以加一个 kafka
FileBeat
1 )基本组成
- Prospector (勘测者) 负责管理 Harvester 并找到所有读取源
- Harvester (收割机)负责读取单个文件内容,每个文件启动一个
2 )工作原理
- 这里有2个 prospector
- 上面一个 prospector 会给每个 log 文件建立一个 harvester, 负责文件内所有数据的上传
- 下面一个 prospector 是监控 apache2目录下的 log 文件,同样的原理
- 它会把上面日志文件的数据整理出来,发送到 es, logstash, kafka 或 redis 上
3 )Filebeat 如何记录文件状态
- 文件状态记录在文件中 (默认在 /var/lib/filebeat/registry)
- Filebeat 会记录发送前的最后一行,并再可以连接的时候继续发送
- 每个Prospector 会为每个找到的文件记录一个状态
- Filebeat 存储唯一标识符以检测文件是否先前被收集
- 由此,可见,Filebeat是记录一系列的状态,来记录文件传输的过程
4 )Filebeat 如何保证事件至少被输出一次
- Filebeat 将每个事件的传递状态保存在文件中
- 在未得到输出方确认时,Filebeat 会尝试一直发送,直到得到回应
- 任何在Filebeat 关闭之前未确认的事件,都会在 filebeat 重启之后重新发送
- 可确保至少发送一次,但有可能会重复
5 )filebeat.yml 文件的配置样例
yml
# Filebeat 输入
filebeat.inputs:
# 类型
- type: log
enabled: true
# 要抓取的文件路径
paths:
- ./*.log
# 输出 这里输出到 logstash, 也可输出到 es
output.logstash:
# logstash 地址
hosts: ["localhost: 5044"]
Logstash 工作原理
- 主要是三个阶段:inputs -> filters -> outputs
- 第一阶段是 Input 输入,会把数据输入到 logstash
- 第二阶段是 Filters 过滤清洗
- 数据中间处理,对数据进行操作, 它会有自己的插件
- 第三阶段是 Outputs 数据输出
- outputs 是 logstash 处理管道的最末端组件
- 可以发送给es来存储和索引
1 )Logstash-Input 阶段常见的输入
- file:从文件系统的文件中读取,类似于
tail -f
命令 - syslog:在 514端口上监听系统日志消息,并根据RFC3164标准进行解析
- beats:从 Filebeat 中读取
2 )Logstash-Input 常用样例
-
.conf 文件
confinput { beats { port => 5044 } tcp { port => 5000 } }
- beats 常用的 5044 是 Inputs 常用样例
- 下面的 tcp 也可以不用写
3 )Logstash-Filter 数据中间件处理插件 grok (可解析任意文本数据)
- Grok 基础语法,如:
%{SYNTAX:SEMANTIC}
- SYNTAX:代表匹配值的类型
- SEMANTIC:代表存储该值的一个变量名称
- 例
%{ERROR|DEBUG|INFO|WARN: log_level}
4 )Logstash-Output 数据输出
-
输出到 kafka 和 es 也可以输出到 redis
-
输出到 es 样例
output { elasticsearch { hosts => "elasticsearch: 9200" user => "elastic" password => "changeme" index => "%{[@metadata][-xxxxx]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } }
Docker-Compose 安装 ELK
1 )ELK docker-compose 编写
-
elasticsearch : 先拉镜像,再对配置进行修改
-
logstash:配置它的input和output
-
kibana: 搭建kibana平台, 有日志生成了, filebeat把程序log传到kibana
-
现在编写代码,ELK 通过一个 docker-stack.yml 来进行管理
-
docker-stack.yml
ymlversion: '3.3' services: elasticsearch: image: elasticsearch:7.9.3 ports: - "9200:9200" - "9300:9300" volumes: - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml environment: ES_JAVA_OPTS: "-Xmx256m -Xms256m" ELASTIC_PASSWORD: xxxxxpwd discovery.type: single-node network.publish_host: _eth0_ logstash: image: logstash:7.9.3 ports: - "5044:5044" - "5000:5000" - "9600:9600" volumes: - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml - ./logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf environment: LS_JAVA_OPTS: "-Xmx256m -Xms256m" kibana: image: kibana:7.9.3 ports: - "5601:5601" volumes: - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
2 ) 各类配置文件编写
-
elasticsearch/config/elasticsearch.yml
yml--- cluster.name: "xxxxx-cluster" network.host: 0.0.0.0 xpack.license.self_generated.type: trial xpack.security.enabled: true xpack.monitoring.collection.enabled: true
-
logstash/config/logstash.yml
yml--- http.host: "0.0.0.0" xpack.monitoring.elasticsearch.hosts: ["http://elasticsearch:9200"] xpack.monitoring.enabled: true xpack.monitoring.elasticsearch.username: elastic xpack.monitoring.elasticsearch.password: xxxxxpwd
-
logstash/pipeline/logstash.conf
confinput { beats { port => 5044 } tcp { port => 5000 } } output { elasticsearch { hosts => "elasticsearch:9200" user => "elastic" password => "xxxxxpwd" index => "%{[@metadata][-xxxxx]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" } }
-
kibana/config/kibana.yml
yml--- server.name: kibana server.host: 0.0.0.0 elasticsearch.hosts: ["http://elasticsearch:9200"] monitoring.ui.container.elasticsearch.enabled: true elasticsearch.username: elastic elasticsearch.password: xxxxxpwd
3 ) 启动和检查
-
启动:$
docker-compose -f docker-stack.yml up -d
-
检查:$
docker-compose -f docker-stack.yml ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS elk-elasticsearch-1 elasticsearch:7.9.3 "/tini -- /usr/local..." elasticsearch About a minute ago Up About a minute 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elk-kibana-1 kibana:7.9.3 "/usr/local/bin/dumb..." kibana About a minute ago Up About a minute 0.0.0.0:5601->5601/tcp elk-logstash-1 logstash:7.9.3 "/usr/local/bin/dock..." logstash About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp, 0.0.0.0:5044->5044/tcp, 0.0.0.0:9600->9600/tcp
-
现在整个日志系统基本已经搭建完毕 ~