Logstash踩坑及输出东八区日志
环境:新入ELK,全新安装官网最新版6.2
1、解决logstash启动慢(摘自网上)
我们在部署ELK环境的时候,全部部署完毕。在启动logstash的时候发现logstash启动比较慢,但是可以启动成功。在网上寻找解决方案,找到一篇帖子写着是因为系统的熵低了,查了一下这个熵好像是用来生成随机数的。下面详细介绍。
cat /proc/sys/kernel/random/entropy_avail
查看返回值多少,如果小于1000,那么需要安装haveged包。
yum install haveged -y
systemctl start haveged
systemctl enable haveged
cat /proc/sys/kernel/random/entropy_avail
可以看到数值变大了。这种方案可以加快logstash的启动时间。
2、默认端口1024下的程序是要在root下才能使用的,所以logstash直接监听514需要用root用户启动
vi /etc/logstash/startup.options
LS_USER=root
LS_GROUP=root
/usr/share/logstash/bin/system-install /etc/logstash/startup.options systemd
systemctl restart logstash
netstat -anlp|grep 514
3、输出到elasticsearch踩坑
output{
elasticsearch {
hosts => "x.x.x.x:9200"
index => "logstash-Applog"
}
}
请注意index中的名称必须是小写,否则会报错,elasticsearch收不到数据,报错如下:
[WARN ][logstash.outputs.elasticsearch] Could not index event to Elasticsearch. {:status=>400, :action=>["index", {:_id=>nil, :_index=>"logstash-Applog-2018.05.22", :_type=>"doc", :_routing=>nil}, #], :response=>{"index"=>{"_index"=>"logstash-Applog-2018.05.22", "_type"=>"doc", "_id"=>nil, "status"=>400, "error"=>{"type"=>"invalid_index_name_exception", "reason"=>"Invalid index name [logstash-Applog-2018.05.22], must be lowercase", "index_uuid"=>"_na_", "index"=>"logstash-Applog-2018.05.22"}}}}
4、logstash输出东八区日志
网上查很多,都省略或者过时的配置,被坑很久,,终于成功,配置如下:
filter {
ruby {
code => "event.set('mylogtime', event.get('@timestamp').time.localtime + 8*60*60)
event.set('mylogday', event.get('@timestamp').time.localtime + 8*60*60)"
}
mutate {
convert => ["mylogtime", "string"]
gsub => ["mylogtime", "T", "-"]
gsub => ["mylogtime", ":([\S\s]*?)Z", ""]
convert => ["mylogday", "string"]
gsub => ["mylogday", "T([\S\s]*?)Z", ""]
}
}
output{
file {
gzip => true
path => "/tmp/%{mylogday}/%{mylogtime}/%{host}-%{mylogtime}.log.gz"
codec => plain {
format => "%{message}"
}
}
}
以下是解释:
在filter-ruby中建立两个新属性,mylogday和mylogtime,都取日志时间加八小时(EL中通用为0时区时间),mutate对其截取做格式化,变成两个值,一个是日期,一个是日期+小时
在output-file中输出,输出结果如下
# ls /tmp/2018-05-22/
127.0.0.1-2018-05-22-17.log 127.0.0.1-2018-05-22-18.log
如果数量太多可以再加一级目录
path => "/tmp/%{mylogday}/%{mylogtime}/%{host}-%{mylogtime}.log.gz"
最后,输出内容采用日志的源格式,在网上查的很多人写的是message_format => "%{message}",亲测在logstash6中无效,可能是以前版本的写法,正确写法如下:
codec => plain {
format => "%{message}"
}