ELK文集

Logstash的随记

2018-05-24  本文已影响1人  靈08_1024

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"
    ]
}

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

上一篇下一篇

猜你喜欢

热点阅读