ELK(一)Logstash

来源:互联网 发布:淘宝买苹果游戏可靠吗 编辑:程序博客网 时间:2024/05/27 20:15

关于ELK的历史跟作用在此就不说了,相信网上很多,大家都能够搜到,在此我说下他们的安装及使用。

一、logstash的下载及安装

下载:wget https://artifacts.elastic.co/downloads/logstash/logstash-5.2.2.tar.gz

解压: tar –vzxf logstash-5.2.2.tar.gz

bin/logstash –f logstash.cnf

进行运行logstash.conf 配置文件里面的设置

长期运行:一句话就可以搞定,如果想让某命令在后台长期运行,需要在命令前加 nohup,后面加 &

二、input配置

file插件

在logstash中可以在input里面添加file配置,默认的最小化配置如下:

input {    file {        path => "E:/software/logstash-1.5.4/logstash-1.5.4/data/*"    }}filter {}output {    stdout {}}
注意:文件路径名用绝对路径,并且支持globs写法。

file插件还有一些其他的属性。

file {        #监听文件的路径        path => ["E:/software/logstash-1.5.4/logstash-1.5.4/data/*","F:/test.txt"]        #排除不想监听的文件        exclude => "1.log"        #添加自定义的字段(在输出结果中增加一个字段)        add_field => {"test"=>"test"}        #增加标签        tags => "tag1"        #设置新事件的标志        delimiter => "\n"        #设置多长时间扫描目录,发现新文件        discover_interval => 15        #设置多长时间检测文件是否修改        stat_interval => 1         #监听文件的起始位置,默认是end        start_position => beginning        #监听文件读取信息记录的位置        sincedb_path => "E:/software/logstash-1.5.4/logstash-1.5.4/test.txt"        #设置多长时间会写入读取的位置信息        sincedb_write_interval => 15    }

其中input常用的输入源有:file,syslog,redis,log4j,apache log或nginx log等等

三、codec配置

如果事件数据是json格式,可以加入codec=>json来进行解析
output{stdout{codec=>jsoncodec=>json_lines{#如果你的json文件比较长,需要换行那么就得用到json_lines的编码方式了}}

multiline多行事件编码 
有时候有的日志会用很多行去展现,这么多行其实都是一个事件。比如JAVA的异常日志

input{stdin{codec=>multiline{charset=>...#字符编码,可选max_bytes=>#bytes类型,设置最大的字节数,可选max_lines=>#number类型,设置最大的行数,默认是500行,可选multiline_tag=>#string类型,设置一个事件标签,默认是"multiline",可选pattern=>...#string类型,设置匹配的正则表达式,必选patterns_dir=>...#array类型,可以设置多个正则表达式,可选negate=>...#boolean类型,设置正向匹配还是反向匹配,默认是false,可选what=>...#设置未匹配的内容是向前合并还是向后合并,previous,next两个值选择,必选}}}

四、filter配置

Grok正则

使用grok filter需要在logstash的配置文件中加上这样的内容:
filter {    grok {        match => { "message" => "grok_pattern" }    }}

这段代码中除了grok_pattern以外都是logstash的关键字。grok_pattern部分需要使用者填充自己的解析方式。

grok_pattern由零个或多个%{SYNTAX:SEMANTIC}组成,其中SYNTAX是表达式的名字,是由grok提供的,例如数字表达式的名字是NUMBER,IP地址表达式的名字是IP。SEMANTIC表示解析出来的这个字符的名字,由自己定义,例如IP字段的名字可以是client。

对于下面的这条日志

55.3.244.1 GET /index.html 15824 0.043

可以这样解析

* client: 55.3.244.1
* method: GET
* request: /index.html
* bytes: 15824
* duration: 0.043

Date插件

filter {
    grok {
        match => ["message", "%{HTTPDATE:logdate}"]
    }
    date {
        match => ["logdate", "dd/MMM/yyyy:HH:mm:ss Z"]
    }
}

数据修改( Mutate)

类型转换是 filters/mutate 插件最初诞生时的唯一功能。可以设置的转换类型包括:"integer""float" "string"。示例如下:

filter {
    mutate {
        convert => ["request_time", "float"]
    }
}

字符串处理:

Split分割

filter {
    mutate {
        split => ["message", "|"]
    }
}

Join 仅对数组类型字段有效

我们在之前已经用 split 割切的基础再 join 回去。配置改成:

filter {

    mutate {

        split => ["message","|"]

    }

    mutate {

        join => ["message",","]

    }

}

merge

合并两个数组或者哈希字段。依然在之前 split的基础上继续:

filter {

    mutate {

        split => ["message","|"]

    }

    mutate {

        merge => ["message","message"]

    }

}

Merge会将所有的装进一个数组里面

如果 src字段是字符串,会自动先转换成一个单元素的数组再合并。

GEOIP地址查询归类

filter {

    geoip {

        source => "message"

    }

}

运行结果:

{

      "message" =>"183.60.92.253",

     "@version" =>"1",

   "@timestamp" =>"2014-08-07T10:32:55.610Z",

         "host" => "raochenlindeMacBook-Air.local",

        "geoip" => {

                     "ip" => "183.60.92.253",

          "country_code2" =>"CN",

          "country_code3" =>"CHN",

           "country_name" =>"China",

         "continent_code" =>"AS",

            "region_name" =>"30",

              "city_name" =>"Guangzhou",

               "latitude" =>23.11670000000001,

              "longitude" =>113.25,

               "timezone" =>"Asia/Chongqing",

       "real_region_name" =>"Guangdong",

               "location" => [

            [0]113.25,

            [1]23.11670000000001

        ]

    }

}

GeoIP 库数据较多,如果你不需要这么多内容,可以通过 fields 选项指定自己所需要的。下例为全部可选内容:

filter {

    geoip {

        fields => ["city_name","continent_code", "country_code2","country_code3", "country_name", "dma_code","ip", "latitude", "longitude","postal_code", "region_name", "timezone"]

    }

}

Split拆分事件:

filter {

    split {

        field => "message"

        terminator => "#"

    }

}

会分割成n个事件。

注意:split拆分事件后会直接进入到output阶段,所有的split后的其他插件都不可以用了。

output配置

标准输出:

output {

    stdout {

        codec => rubydebug

        workers => 2

    }

}

保存到文件:

output {

    file {

        path =>"/path/to/%{+yyyy/MM/dd/HH}/%{host}.log.gz"

        message_format =>"%{message}"

        gzip => true

    }

}

输出到elasticsearch

output {

    elasticsearch {

        host => "192.168.0.2"

        protocol => "http"

        index =>"logstash-%{type}-%{+YYYY.MM.dd}"

        index_type => "%{type}"

        workers => 5

        template_overwrite => true

    }

}

输出到redis

input {stdin {} }

output {

    redis {

        data_type => "channel"

        key =>"logstash-chan-%{+yyyy.MM.dd}"

    }

}