因为某些原因需要使用到ELK,所以在这里总结下
准备工作
架构:filebeat->logstash->elasticsearch
filebeat-5.5.1、elasticsearch-2.4.1、logstash-2.4.0、kilbana-4.6.1
filebeat安装部署:
加入以下内容:
- input_type: log
paths:
- /opt/logs/nginx.log
fields:
tag: nginx
########################################################
output.logstash:
# The Logstash hosts,logstash机器ip加端口,配置到该机器上存储日志内容hosts: ["xx.xx.xx.xx:5044"]
2.elasticsearch安装部署
cluster.name: elk
node.name: elk-1
path.data: /data/es-data
path.logs: /var/log/elasticsearch/
network.host: 0.0.0.0
http.port: 9200
x.x.x.x:9200/_plugin/head
3.Logstash安装与部署
input{srdin{}}
output{elasticsearch{hosts=>["localhost:9200"]}}
4.kibana部署与使用
这里的安装部署流程是很简单的,难点在logstash的转发到elasticsearch的正则
本人使用的是创建自定义正则文件,然后匹配正则,所以,这里要和开发人员沟通日志格式,将所有日志以json形式存储
filebeat在转发的时候会把日志自动进行一次json格式转换,先解json,然后对日志内容进行解析,remove掉多余的内容
以上是粗版本,之后还会根据使用详细记录
因为所有日志文件会堆积在elasticsearch机器上,所以需要定时清理
看到别人的定时清理脚本,觉得自己还有很长的运维路走,这里放上自己的定时清理脚本
#!/bin/sh
CS_DATE1=`date +%s`
sec_10day=$((CS_DATE1 - 1728000))
sec_30day=$((CS_DATE1 - 2592000))
day_10before=`date -d @$sec_10day +%Y.%m.%d`
day_30before=`date -d @$sec_30day +%Y.%m.%d`
curl -XDELETE https://x.x.x.x/logstash-$day_30before
curl -XDELETE https://x.x.x.x/logstash-$day_10before
遇到的问题:1.当接收到的日志量太大时会导致,elastisearch上面日志是正常接收的,但是在kibana上展示内容显示不出来
2.logstash上转存的程序因为启动后会日志输出会占满屏幕,所以使用的后台运行的screen
3.关于时间戳UTC更改,
match => {"message" => "\[%{TIMESTAMP_ISO8601:datetime1}\]"}
date {
match => ["datetimei1", "yyyy-MM-dd HH:mm:ss.SSS Z"]target => "@timestamp"
}
正则匹配规则:
一般而言,logstash有自己的正则,可以到书里面去找找对应的字段规则,但是想要自由的匹配正则要怎么办呢?
1.建立一个自己的正则库,把文件命名为grok_runlog,放在patterns下面,方便调用
需要的字段,举个例子:
LINE1 \line\:\w*
FILENAME .*
EXECUTETIME \w*\:\w*
2.调用
grok {
patterns_dir => "/opt/logstash-2.4.0/patterns/grok_runlog"
match => {
"message" => "\[%{TIMESTAMP_ISO8601:datetime1}\] \[%{LEVEL:level}\] \[%{CLASS:class}\] \[%{ACTION:action}\] \[%{LINE1:line}\] %{INFORMATION:information}"
}
}
因为这里面的字段要一一对应,但是常常会导致information里面的字段匹配到前面的字段,所以,这里可以在包含更多内容的字段前面直接匹配字符,保证前后正常对应