ELK(一)Logstash

關於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=>json
codec=>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}"

    }

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章