无聊发发最近玩的ELK
elasticsearch
首先部署elasticsearch,目前为止我用的是比较新的版本(7.1.0)
官网下载elasticsearch,解压运行
看下配置问题,默认是./config/elasticsearch.yml,仔细看看里面有个日志目录和数据目录需要改一下,和自己添加目录。
新建用户,切换用户。
运行命令
./bin/elasticsearch
./bin/elasticsearch -d # 后台运行
如果在centos中运行,会遇到各种跟系统配置冲突的问题。如vm.max_map_count,改系统文件就行了,不用重启。
启动好了,记得测试下
访问 127.0.0.1:9200,应该会出现如下结果,如果不是,应该就是没启动成功,或者其他问题了
kibana
版本和elasticsearch版本一致,不多介绍,目前没用到多少。默认端口5601
logstash
版本和elasticsearch版本一致。主要进行数据分词,在elasticsearch添加索引,给elasticsearch输入数据。logstash插件很多,但是运行时占用内存高,一般不部署在每个机器上直接监听日志文件输出。
运行命令:先启动elasticsearch
./bin/logstash -f ./config/logstash_test.conf
指定配置文件./config/lostash_test.conf运行,配置内容主要有下面三个
# 输入
input {
redis {
host => "127.0.0.1"
port => 6379
# password => "123456" # redis密码,没有密码就不需要这个参数
key => "apilog" #这里的key值和filebeat配置文件中output.redis的key值保持一致
data_type => "list"
db =>1
}
}
# 过滤,在这里进行分词,[fields][filetype]和filebeat中的一致
filter {
if [fields][filetype] == "apiweb_producelog" {
json {
source => "message"
remove_field => ["_type","beat","offset","tags","prospector"] #移除字段,不需要采集
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"] #匹配timestamp字段
target => "@timestamp" #将匹配到的数据写到@timestamp字段中
}
}
}
# 输出,最后一个是加上时间,按日期对日志进行分开收集
output {
# 输出到 Elasticsearch,根据filebeat中配置的filetype,在ES中建立不同的索引
if [fields][filetype] == "apiweb_producelog" {
elasticsearch {
# Elasticsearch 地址
hosts => ["localhost:9200"]
# Elasticsearch 索引名
index => "producelog"
}
} else if [fields][filetype] == "apiweb_supplierlog" {
elasticsearch {
hosts => ["localhost:9200"]
index => "supplierlog"
}
} else {
elasticsearch {
hosts => ["localhost:9200"]
index => "apilog-%{+YYYY.MM.dd}"
}
}
}
filebeats
简单的收集器,具有占用内存小,方便部署等优势,因此作为部署在每台服务器上的日志收集器。
将filebeats收集到的数据输出到redis中,当然也可输出到kafka等MQ中,进行缓冲和数据容灾机制处理。
运行命令:
.\filebeat -e -c filebeat.yml
同样是指定filebeat.yml配置文件进行运行。
filebeat.yml如下
# ============================== Filebeat 输入配置==============================
filebeat.inputs:
- type: log
enabled: true
# 每 5 秒检测一次文件是否有新的一行内容需要读取
backoff: "5s"
# 是否从文件末尾开始读取
tail_files: false
# 需要收集的数据所在的目录
paths:
- /Log/2021/*.log
# 自定义字段,在logstash中会根据该字段来在ES中建立不同的索引
fields:
filetype: apiweb_producelog
# logstash配置文件中的[fields][filetype]一致
# 这里是收集的第二个数据,多个依次往下添加
- type: log
enabled: true
backoff: "5s"
tail_files: false
paths:
- /home/openweb/Logs/Warn/*.log
fields:
filetype: apiweb_supplierlog
# ============================== Filebeat modules ==============================
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
setup.kibana:
# ============================== Filebeat 输出配置====================
output.redis:
enabled: true
# redis地址
hosts: ["192.168.1.103:6379"]
# redis密码,没有密码则不添加该配置项
password: 123456
# 数据存储到redis的key值
key: apilog
# 数据存储到redis的第几个库
db: 1
# 数据存储类型
datatype: list
# ================================= Processors =================================
# 猜测和运行环境有关,没有测试过
#processors:
# - add_host_metadata:
# when.not.contains.tags: forwarded
# - add_cloud_metadata: ~
# - add_docker_metadata: ~
# - add_kubernetes_metadata: ~
因此,整体部署架构如下:
盗的图,参考别人博客部署的,并亲自实践成功的一个ELK部署。
参考博客:filebeat+redis+elk构建多服务器日志收集系统配置文件说明 - JcongJason - 博客园