美文网首页ELK文集
Logstash的随记

Logstash的随记

作者: 靈08_1024 | 来源:发表于2018-05-24 17:30 被阅读1次

    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 {}的位置没写对)都会报这个错误的。但上面给的🍐是正确的。

    相关文章

      网友评论

        本文标题:Logstash的随记

        本文链接:https://www.haomeiwen.com/subject/hscfaxtx.html