Logstash的随记

logstash的随记 在选择了queue.type为persisted时,如果同时指定queue.max_bytesqueue.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表示刷新后,清空重新探查。userpassword是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" ] }

【Logstash的随记】虽然日志是成功打出来了,但是最后的tags那里的_grokparsefailure,就是错误描述。百度了一下,说是有一丁点错误(我是NGINXACCESS {}的位置没写对)都会报这个错误的。但上面给的是正确的。

    推荐阅读