ELK部署教程
背景原因什么的就不费话了,直接开始吧
我的流程是这样的
filebeat --> logstash --> elasticsearch --> kibana 有没有很简单
filbeat会部署在多个服务器上收集日志,后三个部署在单独的服务器上
版本:
java: 1.8
filebeat, logstash, elasticsearch, kibana: 7.0.0
为了不必要的麻烦,尽量选择一直的版本
产品下载地址:https://www.elastic.co/downloads/
elasticsearch里面有一个x-pack插件,可以对kibana加密,可以开启权限控制之类的,7.0.0已经可以免费使用了,所以不要下载太老的版本,不然是要收费的
下载好之后都分别解压到某个目录就好
filebeat
filebeat与需要收集的日志放在同一个服务器中,她的配置主要在filebeat.yml这个文件中
filebeat.inputs:
- type: log
enable: true
document_type: "log"
paths:
- /opt/...
fields:
logtype: test.log
tag: test
multiline: #如果不写这里的配置的话,如果日志中有错误日志,那么她只收集ERROR所在的一行
pattern: '^#' 后面的错误详情是不会收集的,因为filebeat是按行收集的,而他认为一个行的开
negate: true 头是#,所以这里做一下处理,告诉filebeat不以#开头的行都算在上一行
match: after
output.logstash: //配置好logstash的ip和端口
# The Logstash hosts
hosts: ["ip:port"]
启动命令:nohup ./filebeat -e -c filebeat.yml -d "publish" & --后台启动
logstash
可以把logstash-7.0.0/config/下面的conf文件复制一份,重命名一下,再进行配置
input {
beats {
port => 5044(默认端口)
}
}
filter {
if [fields][tag] == "test" {
grok {
match => {"message" => "%{IP:clientip} - - \[%{TIMESTAMP_ISO8601:times}\] \"%{WORD:request_action} %{DATA:request} HTTP/%{NUMBER:http_version}\" %{NUMBER:status:int} %{NUMBER:body_sent:int} "}
}
date {
match => ["times", "yyyy-MM-dd HH:mm:ss.SSS"]
}
}
}
output {
if [fields][tag] == "test" {
# stdout {
# codec=>rubydebug{}
# }
elasticsearch {
hosts => ["http://ip:9200]
index => "test.log-%{+YYYY.MM.dd}"
}
}
}
logstash的配置文件里grok是一个很有用的东西,他可以对你的日志做解析,结构化,分段分块分别做处理之类的,很强大,不过需要对正则比较熟悉
grok下面有个date需要解释一下,因为filebeat收集非常快,可能在一毫秒之间就会收集几十条日志,这个时候传到logstash的日志就会在毫秒级别乱序,最终展示在kibana中的日志可能下一毫秒的日志显示在上一毫秒的上面,为了解决这种情况,就是将时间换成产生这条日志本身的时间而不是收集这条日志的时间
启动命令:`nohup ./bin/logstash -f config/logstash-sample.conf &
elasticsearch
主要配置文件:elasticsearch-7.0.0/config/elasticsearch.yml
关键配置:
node.name: node-1
network.host: 自己的ip
http.port: 9200(默认端口)
cluster.initial_master_nodes: ["node-1"]
启动命令:`./bin/elasticsearch -d`(后台启动,必须使用elk用户启动)
kibana
主要配置文件:kibana-7.0.0-linux-x86_64/config/kibana.yml
关键配置
server.port: 5601
server.host: "ip"
elasticsearch.hosts: ["http://ip:9200"]
启动命令:nohup ./bin/kibana &
停止命令:根据端口(5601)查找进程号然后kill,因为kibana是node.js写的,直接查找grep kibana
是找不到kibana进程的
然后就可以在浏览器里输入kibana的ip访问了
定时清理elasticsearch日志
收集日志如果每天的日志量非常大的话,不久磁盘就会被撑爆,所以要做好定时删除数据的任务,但是删除数据不能盲目删除,否则删不干净就会导致一系列麻烦
elasticsearch-curator
curator允许对索引和快照执行许多不同的操作,这里使用它来删除索引和数据
安装好curator之后,建立elasticsearch-curator工作空间
然后建立如图所示的两个文件
action.yml
actions:
1:
action: delete_indices # 这里执行操作类型为删除索引
description: "delete index expire date"
options:
ignore_empty_list: True
timeout_override:
continue_if_exception: False
disable_action: False
filters:
- filtertype: pattern
kind: regex # 这里是指以正则表达式匹配索引
value: '^(这里将你在logstash中配置的索引名(前缀就行)写在这里(比如这里的test)).*$'
# 这里匹配时间
- filtertype: age
source: name # 这里不但可以根据name来匹配,还可以根据字段等,详见官方文档
direction: older
# 这里定义的是days,还有weeks,months等,总时间为unit * unit_count
unit: days
unit_count: 7 #保留7天的日志
timestring: '%Y.%m.%d' # 这里是跟在前面pattern后面的时间的格式
curator.yml
client:
hosts:
- ip #elasticsearch的ip
port: 9200
url_prefix:
use_ssl: False
certificate:
client_cert:
client_key:
ssl_no_validate: False
# http_auth: elastic:123456
timeout:
master_only: True
logging:
loglevel: INFO
logfile:
logformat: default
blacklist: ['elasticsearch', 'urllib3']
执行命令
curator --config curator.yml action.yml
可以在执行前和执行后用以下命令查看所有索引已确认是否生效
curator_cli --host es的ip --port 9200 show_indices --verbose
也可以用df -h
查看空间以确认