前言
业务日志之前只是通过elk把进行了收集,没有进行其他过多的处理。 然后在使用过程中发现,要搜索日志内容,通过kibana还是比较简单的,但是一旦日志不规则,要对日志进行统计分析难度还是很大的,所以为了排查问题,公司的基础框架增加了accesslog的记录,所以需要规则导入到es中。之前对elk了解也不太多,所以借助这个机会深入的学习了一回。不过这一次都是搭建在一个1核2g的内存的单机版本,如果要扩张到多台机器,改变也不是很大,只是把相关组件配置成集群模式。
整体架构
- 业务方都使用统一的基础框架,所以基础框架可以在请求的时候,通过记录请求信息(类似于nginx的accesslog),并且对格式进行统一化。
- 通过基础框架把日志按照业务名称打到规定的目录和规定的日志文件中。
- 通过机器上的filebeat把日志进行收集,然后传输到kafka中
- logstash从kafka把日志拿出来,然后进行一定的过滤,再存储到es中
- 通过kibana来搜索es中的数据进行展示
搭建过程和细节
- 配置环境,在网上下载了,所有组件的最新版本,其中包括了, kafka、elk、filebeat,然后上传到了服务,然后服务器比较垃圾, 是阿里云上面的1个1核2g的机器。
- 为所有的基础组件都编写的对应的service配置文件,准备以systemd的方式来进行启动
zookeeper
首先启动了单机版本的zk,zk是直接用kafka自带,并没有改变任何配置,启动命令就是/bin/bash /home/loc/kafka_2.12-0.11.0.0/bin/zookeeper-server-start.sh /home/loc/kafka_2.12-0.11.0.0/config/zookeeper.properties
可以通过查看2181端口是否存在监听或者进程来判断是否成功启动
kafka
因为kafka是依赖于zk的,所以zk启动成功之后,就启动kafka,命令是/bin/bash /home/loc/kafka_2.12-0.11.0.0/bin/kafka-server-start.sh /home/loc/kafka_2.12-0.11.0.0/config/server.properties
,kafka的配置文件进行了部分修改,因为为了只监听本地,所以在kafka的配置文件中增加了配置listeners=PLAINTEXT://127.0.0.1:9092
, 指定kafka的日志存放目录log.dirs=/tmp/kafka-logs
, 修改了zk的默认path: zookeeper.connect=localhost:2181/kafka
可以通过端口号、进程、kafka的bin目录下面的脚本,或者从/tmp/kafka-logs
目录中的文件查看是否正常运行和传输数据
filebeat
通过filebeat从指定的目录里面的log文件,读取文件内容,并且发送到kakfa中,通过设置document_type: filebeat
来指定发送到kafka的topic,然后配置output.kafka
output.kafka:
hosts: ["127.0.0.1:9092"]
topic: '%{[type]}'
partition.round_robin:
reachable_only: false
required_acks: 1
compression: gzip
max_message_bytes: 1000000
并且配置对数据进行json处理
processors:
- decode_json_fields:
fields: ["message"]
process_array: false
max_depth: 1
target: ""
overwrite_keys: true
最后通过命令/home/loc/filebeat-5.6.2-linux-x86_64/filebeat -c /home/loc/filebeat-5.6.2-linux-x86_64/filebeat.yml start
启动, 如果需要调试,可以通过增加debug配置
logging:
level: debug
to_files: true
to_syslog: false
files:
path: /opt/logs/mybeat
name: mybeat.log
keepfiles: 7
rotateeverybytes: 10485760 # = 10MB
通过查看 /opt/logs/mybeat
目录下面的log文件进行检查
es
因为es启动不能以root方式启动,所以单独创建了一个es的用户和组,用于启动es,然后把es启动需要访问的配置文件目录,修改成es用户是可以进行读取的。然后由于机器内存较小,修改了jvm.options
配置,改成了128m,最后通过命令/bin/bash /home/loc/elasticsearch-5.6.2/bin/elasticsearch
进行启动,启动后,可以通过curl 'localhost:9200'
进行测试
logstash
因为logstash是从kafka接受数据,所以需要先安装kafka的input的plugin,然后把logstash的input设置成kafka
input {
kafka {
bootstrap_servers => "127.0.0.1:9092"
topics => ["filebeat"]
client_id => "logstash-client-id"
group_id => "logstash_client_id"
add_field => {
"log_origin" => "kafka"
}
}
}
结果输出存储到es中
output {
elasticsearch {
hosts => ["localhost:9200"]
codec => json
}
}
由于机器内存的问题,同样要修改logstash的jvm.options
配置,启动内存改到128m
然后以启动命令/bin/bash /home/loc/logstash-5.6.2/bin/logstash -f /home/loc/logstash-5.6.2/config/logstash.conf
进行启动
然后可以通过logs/logstash-plain.log
日志进行检查
kibana
为了能够使得我本地开发的机器可以访问到web页面,所以修改了kibana的server.host: "0.0.0.0"
,并且把阿里云的5601端口进行了开放。然后通过命令/bin/bash /home/loc/kibana-5.6.2-linux-x86_64/bin/kibana
进行启动
然后通过访问 阿里云机器的 5601端口进行测试,看是否能打开web页面
总结
这样就把基础组件基本安装完成, 接下来再总结一下如何进行框架的统一的accesslog的内容进行统计和分析