logstash的随记
在选择了queue.type为persisted时,如果同时指定queue.max_bytes
和queue.max_events
时,会挑选一个好达到的参数来执行。
logstash的启动:
./bin/logstash -f config/logstash.conf
。
后台启动:
nohup ./bin/logstash -f config/logstash.conf &
。
使用后台启动时,内容会输出到ES中,可以直接在ES中去查看;使用启动时,内容会输出在控制台和ES数据库中。
在config下面自定义一个logstash.conf文件,内容:
这个内容是分析nginx的,但是由于项目中也常会有分析自定义的log文件,所以文件分析会在后面研究。
input{
file{
path => ["/usr/local/Cellar/nginx/1.12.2_1/logs/access.log"]
type => "nginx_access"
start_position => "beginning"
}
}
filter{
if [type == "nginx_access"] {
grok {
patterns_dir =>"/usr/local/elk/logstash-5.6.4/config/patterns"
match =>{
"message" => "%{NGINXACCESS}"
}
}
date{
match => ["timestamp","dd/MMM/YYYY:HH:mm:ss Z"]
}
#过滤数据,如果http版本不等于1.1,丢弃数据
if[httpversion] != "1.1" {
drop {}
}
if[param] {
ruby{
init => "@kname = ['quote','url_args']"
code => "
new_event = LogStash::Event.new(Hash[@kname.zip(event.get('param').split('?'))])
new_event.remove('@timestamp')
event.append(new_event)
"
}
if[url_args] {
ruby{
init => "@kname = ['key','value']"
code => "event.set('nested_args',event.get('url_args').split('&').collect{|i| Hash[@kname.zip(i.split('='))]})"
remove_field => ["url_args","param","quote"]
}
}
}
mutate {
convert => ["response","integer"]
remove_field => "timestamp"
}
}
}
output{
if "_grokparsefailure" not in [tags] and "_dateparsefailure" not in [tags] {
#ruby的debug打印
stdout{
codec => rubydebug
}
elasticsearch{
hosts =>["http://localhost:9200/"]
index =>"logstash-%{type}-%{+YYYY.MM.dd}"
document_type =>"%{type}"
flush_size => 200
idle_flush_time => 1
sniffing => true
#user => "wx"
#password => "wx"
}
}
}
ps:上面的月份,2个和3个M效果是一样的。但网上好多都是2个的。
在output中:
host
表示es主机地址;index
表示要为logstash新建的索引(自动创建);doucument_type
为es的type;flush_size
表示刷新条数,即达到条数时,写入ES;idle_flush_time
表示刷新间隔时间;sniffing
表示刷新后,清空重新探查。user
和password
是es的用户名和密码。
默认创建的索引有5个分片,5个副本。如果有需求的话(想减少或者增加logstash的分片数),可以使用templete来配置。ps:该方法只适用于初期创建,若已有数据,请先备份再进行测试。
在nginx下添加文件和目录:
mkdir patterns
,touch nginx
。
内容如下:
NGINXACCESS %{IPORHOST:clientip} %{HTTPDUSER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{URIPATH:uri}%{URIPARAM:param}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{QS:x_forwarded_for}
======================= 错误 ================================
在使用期间,出现了一个错误,但当时不知道是错误(真是跪了。。),具体错误的现象是:
{
"path" => "/usr/local/Cellar/nginx/1.12.2_1/logs/access.log",
"@timestamp" => 2018-01-21T06:35:19.304Z,
"@version" => "1",
"host" => "fulingdeMacBook-Pro.local",
"message" => "127.0.0.1 - - [21/Jan/2018:14:35:18 +0800] \"GET /search?word=%27a%27 HTTP/1.1\" 200 2 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36\" \"-\"",
"type" => "nginx_access",
"tags" => [
[0] "_grokparsefailure"
]
}
虽然日志是成功打出来了,但是最后的tags那里的_grokparsefailure
,就是错误描述。百度了一下,说是有一丁点错误(我是NGINXACCESS {}的位置没写对)都会报这个错误的。但上面给的是正确的。