ELK: Elasticsearch + Logstash + Kibana
2023-05-21 00:08:55 726
接上文Elasticsearch和Kibana的安装
https://blog.22xcode.com/article/537114564689395713
这里安装最后一个组件Logstash
- docker pull logstash:8.7.1
docker run -d --name=logstash logstash:8.7.1
- 把容器内的配置文件拷贝出来.
docker cp logstash:/usr/share/logstash/config/ /usr/local/logstash/newconfig/
- 修改logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://172.19.0.8:9200" ]
#Logstash将其日志写到的目录
path.logs: /usr/share/logstash/logs
- 新建conf.d文件夹
- 新增文件conf.d/logstash-user-web-debug.conf
input {
file {
#标签
type => "systemlog-localhost"
path => "/usr/app-log/user-web/logs/debug.log"
#开始收集点
start_position => "beginning"
#扫描间隔时间,默认是1s
stat_interval => "1"
}
}
filter {
dissect {
mapping => {
"message" => "[%{date}] [%{application}] [%{ip}] [TID:%{tid}] [%{thread}] [%{level}] [[[[%{info}]]]]"
}
}
date {
match => ["date", "ISO8601"]
timezone => "Asia/Shanghai"
}
}
output {
elasticsearch {
#集群的话,直接添加多个url
hosts => ["172.19.0.8:9200"]
user =>"elastic"
password =>"elastic"
index => "logstash-system-debug-user-web-%{+YYYY.MM.dd}"
}
#在控制台输出logstash的日志
stdout { codec=> rubydebug }
}
- 修改pipelines.yml
- pipeline.id: main
path.config: "/usr/share/logstash/pipeline"
# 多个管道就定义多个配置 从而实现多应用分级别的日志搜集
- pipeline.id: user-web-debug
queue.type: persisted
path.config: "/usr/share/logstash/config/conf.d/logstash-user-web-debug.conf"
- 删除旧容器
docker run -d --name=logstash --network rootnet -v /usr/local/app-log/:/usr/app-log/ -v /usr/local/logstash/config/:/usr/share/logstash/config/ logstash:8.7.1
- 在kibana中新建一个数据视图选择对应的index (logstash-system-debug-user-web-2023.05.20)就可以看到数据了
- 我们的logstash配置是根据日期创建index的, 每一天的日志都是一个index (优化查询性能). 所以需要一个别名匹配所有这种类型的index
- 在kibana中创建一个index templates, index pattern:
logstash-system-debug-user-web-*
- 由于当前已经有日志数据了, 所以在新建数据视图时会选择不了新建的模板, 将
logstash-system-debug-user-web-*
的索引先删除, 再触发日志的输出 - 创建数据视图后效果如下
- 创建一个索引生命周期策略, 超过三天删除旧数据(实际环境中自由调整), 关联当前模板. 索引生命周期策略数据如下
POST _ilm/policy/custom-delete
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_primary_shard_size": "50gb",
"max_age": "3d"
}
}
},
"warm": {
"min_age": "0ms",
"actions": {
"forcemerge": {
"max_num_segments": 1
}
}
},
"delete": {
"min_age": "3d",
"actions": {
"delete": {
"delete_searchable_snapshot": true
}
}
}
},
"_meta": {
"defaults": {
"delete_min_age": "Using value of [3d] based on the monitoring plugin default"
},
"description": "Index lifecycle policy generated for [monitoring-*-8] data streams"
}
}
}
- 将当前生命周期策略关联上
logstash-system-debug-user-web
这个索引模板, 然后发现报错了:illegal_argument_exception: setting [index.lifecycle.rollover_alias] for index [xxx] is empty or not defined
. 原因: 之前的索引生命周期在hot 阶段 启用了滚动更新,必须设置新增索引的别名才行 - 解决方案: 1. 关闭滚动更新(开启后可以设置索引超过多少g,或超过多少天,自动新创建一个索引,我们每天创建一个索引,所以用不到这个)2. 把原来已经应用策略的索引,先解除关联策略,再重新添加上策略,否则老索引还是无法正常自动删除
- error日志输出的stack在es中存储为了一条一条的记录. 可以通过安装logstash-filter-multiline插件解决.
- 进入logstash/bin目录下执行命令:
./logstash-plugin install logstash-filter-multiline
, 如果报错 certificate verify failed 则在install 后面加上 --no-verify - 配置文件的filter节点加上
multiline { pattern => "^\s" what => "previous" }
. 重启logstash, 触发异常, 可以看到异常展示为了一行