二、logstash原理和使用

一、概述

1.1 logstash簡介

? logstash是一個數(shù)據(jù)分析軟件,主要目的是分析log日志。整一套軟件可以當(dāng)作一個MVC模型,logstash是controller層,Elasticsearch是一個model層,kibana是view層。首先將數(shù)據(jù)傳給logstash,它將數(shù)據(jù)進(jìn)行過濾和格式化(轉(zhuǎn)成JSON格式),然后傳給Elasticsearch進(jìn)行存儲、建搜索的索引,kibana提供前端的頁面再進(jìn)行搜索和圖表可視化,它是調(diào)用Elasticsearch的接口返回的數(shù)據(jù)進(jìn)行可視化。logstash和Elasticsearch是用Java寫的,kibana使用node.js框架。

成都創(chuàng)新互聯(lián)公司是專業(yè)的靖遠(yuǎn)網(wǎng)站建設(shè)公司,靖遠(yuǎn)接單;提供成都做網(wǎng)站、網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行靖遠(yuǎn)網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

1.2 logstash架構(gòu)

二、logstash原理和使用

圖1.1 logstash架構(gòu)

logstash工作時,主要設(shè)置3個部分的工作屬性。
input:設(shè)置數(shù)據(jù)來源
filter:可以對數(shù)據(jù)進(jìn)行一定的加工處理過濾,但是不建議做復(fù)雜的處理邏輯。這個步驟不是必須的
output:設(shè)置輸出目標(biāo)

二、logstash部署

可以直接到 https://www.elastic.co/downloads/logstash 下載想要的版本,這里使用的是6.6.2 版本。部署其實很簡單,現(xiàn)在下來直接解壓就可以使用了,類似于flume,關(guān)鍵在于采集配置文件的編寫。
一般就是使用如下方式啟動logstash

調(diào)試方式:直接啟動前臺進(jìn)程
bin/logstash -f /path/to/configfile

生產(chǎn)環(huán)境中一般后臺啟動:
nohup bin/logstash -f /path/to/configfile  >標(biāo)準(zhǔn)日志 2>錯誤日志 &

啟動前,可以使用 -t 選項測試配置文件是否有語法錯誤,如:
bin/logstash -f /path/to/configfile -t

三、編寫配置文件

3.1 input配置

3.1.1 讀取文件

例子:監(jiān)控文件內(nèi)容輸出到console
input {
    file {
        path => ["/var/log/*.log", "/var/log/message"]
        type => "system"
        start_position => "beginning"
}

}
output{stdout{codec=>rubydebug}}

有一些比較有用的配置項,可以用來指定 FileWatch 庫的行為:

discover_interval
logstash 每隔多久去檢查一次被監(jiān)聽的 path 下是否有新文件。默認(rèn)值是 15 秒。

exclude
不想被監(jiān)聽的文件可以排除出去,這里跟 path 一樣支持 glob 展開。

close_older
一個已經(jīng)監(jiān)聽中的文件,如果超過這個值的時間內(nèi)沒有更新內(nèi)容,就關(guān)閉監(jiān)聽它的文件句柄。默認(rèn)是 3600 秒,即一小時。

ignore_older
在每次檢查文件列表的時候,如果一個文件的最后修改時間超過這個值,就忽略這個文件。默認(rèn)是 86400 秒,即一天。

sincedb_path
如果你不想用默認(rèn)的 $HOME/.sincedb(Windows 平臺上在 C:\Windows\System32\config\systemprofile\.sincedb),可以通過這個配置定義 sincedb 文件到其他位置。

sincedb_write_interval
logstash 每隔多久寫一次 sincedb 文件,默認(rèn)是 15 秒。

stat_interval
logstash 每隔多久檢查一次被監(jiān)聽文件狀態(tài)(是否有更新),默認(rèn)是 1 秒。

start_position
logstash 從什么位置開始讀取文件數(shù)據(jù),默認(rèn)是結(jié)束位置,也就是說 logstash 進(jìn)程會以類似 tail -F 的形式運行。如果你是要導(dǎo)入原有數(shù)據(jù),把這個設(shè)定改成 "beginning",logstash 進(jìn)程就從頭開始讀取,類似 less +F 的形式運行。

3.1.2 標(biāo)準(zhǔn)輸入

stdin模塊是用于標(biāo)準(zhǔn)輸入,簡單來說就是從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)。例子:

input {
    stdin {
        add_field => {"key" => "value"}
        codec => "plain"
        tags => ["add"]
        type => "std"
    }
}
output{stdout{codec=>rubydebug}}

輸入hello,可以看到打印以下信息:
hello
{
       "message" => "hello",
          "tags" => [
        [0] "[add]"
    ],
      "@version" => "1",
          "host" => "bigdata121",
    "@timestamp" => 2019-09-07T03:20:35.569Z,
          "type" => "std",
           "key" => "value"
}

type 和 tags 是 logstash 事件中兩個特殊的字段。通常來說我們會在輸入?yún)^(qū)段中通過 type 來標(biāo)記事件類型。而 tags 則是在數(shù)據(jù)處理過程中,由具體的插件來添加或者刪除的。

3.2 codec配置

? 默認(rèn)情況下,logstash只支持純文本形式的輸入,然后在過濾器filter中將數(shù)據(jù)加工成指定格式。但現(xiàn)在,我們可以在輸入期處理不同類型的數(shù)據(jù),這全是因為有了 codec 設(shè)置。所以,這里需要糾正之前的一個概念。Logstash 不只是一個input | filter | output 的數(shù)據(jù)流,而是一個 input | decode | filter | encode | output 的數(shù)據(jù)流!codec 就是用來 decode、encode 事件的。
例子,輸入json格式數(shù)據(jù)

input {
        stdin {
                add_field => {"key" => "value"}
                codec => "json"
                type => "std"
        }
}
output {
        stdout {codec => rubydebug}
}

當(dāng)輸入json數(shù)據(jù)時,會自動解析出來
輸入:{"name":"king"}
輸出:
{
          "name" => "king",
          "host" => "bigdata121",
    "@timestamp" => 2019-09-07T04:05:42.550Z,
      "@version" => "1",
          "type" => "std",
           "key" => "value"
}

3.3 filter配置

3.3.1 grok插件

logstash擁有豐富的filter插件,它們擴展了進(jìn)入過濾器的原始數(shù)據(jù),進(jìn)行復(fù)雜的邏輯處理,甚至可以無中生有的添加新的 logstash 事件到后續(xù)的流程中去!Grok 是 Logstash 最重要的插件之一。也是迄今為止使蹩腳的、無結(jié)構(gòu)的日志結(jié)構(gòu)化和可查詢的最好方式。Grok在解析 syslog logs、apache and other webserver logs、MySQL logs等任意格式的文件上表現(xiàn)完美。 

這個工具非常適用于系統(tǒng)日志,Apache和其他網(wǎng)絡(luò)服務(wù)器日志,MySQL日志等。

配置:
input {
    stdin {
        type => "std"
    }
}
filter {
  grok {
    match=>{"message"=> "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
  }
}
output{stdout{codec=>rubydebug}}

輸入:55.3.244.1 GET /index.html 15824 0.043
輸出:
{
      "@version" => "1",
          "host" => "zzc-203",
       "request" => "/index.html",
         "bytes" => "15824",
      "duration" => "0.043",
        "method" => "GET",
    "@timestamp" => 2019-03-19T05:09:55.777Z,
       "message" => "55.3.244.1 GET /index.html 15824 0.043",
          "type" => "std",
        "client" => "55.3.244.1"
}

grok模式的語法如下:

%{SYNTAX:SEMANTIC}

SYNTAX:代表匹配值的類型,例如3.44可以用NUMBER類型所匹配,127.0.0.1可以使用IP類型匹配。
SEMANTIC:代表存儲該值的一個變量名稱,例如 3.44 可能是一個事件的持續(xù)時間,127.0.0.1可能是請求的client地址。所以這兩個值可以用 %{NUMBER:duration} %{IP:client} 來匹配。

你也可以選擇將數(shù)據(jù)類型轉(zhuǎn)換添加到Grok模式。默認(rèn)情況下,所有語義都保存為字符串。如果您希望轉(zhuǎn)換語義的數(shù)據(jù)類型,例如將字符串更改為整數(shù),則將其后綴為目標(biāo)數(shù)據(jù)類型。例如%{NUMBER:num:int}將num語義從一個字符串轉(zhuǎn)換為一個整數(shù)。目前唯一支持的轉(zhuǎn)換是int和float。

Logstash附帶約120個模式。你可以在這里找到它們https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

自定義類型

更多時候logstash grok沒辦法提供你所需要的匹配類型,這個時候我們可以使用自定義。

創(chuàng)建自定義 patterns 文件。
①創(chuàng)建一個名為patterns其中創(chuàng)建一個文件postfix (文件名無關(guān)緊要,隨便起),在該文件中,將需要的模式寫為模式名稱,空格,然后是該模式的正則表達(dá)式。例如:

POSTFIX_QUEUEID [0-9A-F]{10,11}

②然后使用這個插件中的patterns_dir設(shè)置告訴logstash目錄是你的自定義模式。

配置:
input {
    stdin {
        type => "std"
    }
}
filter {
  grok {
    patterns_dir => ["./patterns"]
    match => { "message" => "%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}" }
  }
}
output{stdout{codec=>rubydebug}}

輸入:
Jan  1 06:25:43 mailserver14 postfix/cleanup[21403]: BEF25A72965: message-id=<20130101142543.5828399CCAF@mailserver1

輸出:
{
          "queue_id" => "BEF25A72965",
           "message" => "Jan  1 06:25:43 mailserver14 postfix/cleanup[21403]: BEF25A72965: message-id=<20130101142543.5828399CCAF@mailserver1",
               "pid" => "21403",
           "program" => "postfix/cleanup",
          "@version" => "1",
              "type" => "std",
         "logsource" => "mailserver14",
              "host" => "zzc-203",
         "timestamp" => "Jan  1 06:25:43",
    "syslog_message" => "message-id=<20130101142543.5828399CCAF@mailserver1",
        "@timestamp" => 2019-03-19T05:31:37.405Z
}

3.3.2 GeoIP插件

GeoIP 是最常見的免費 IP 地址歸類查詢庫,同時也有收費版可以采購。GeoIP 庫可以根據(jù) IP 地址提供對應(yīng)的地域信息,包括國別,省市,經(jīng)緯度等,對于可視化地圖和區(qū)域統(tǒng)計非常有用。

配置:
input {
    stdin {
        type => "std"
    }
}
filter {
    geoip {
        source => "message"
    }
}
output{stdout{codec=>rubydebug}}

輸入:183.60.92.253
輸出:
{
          "type" => "std",
      "@version" => "1",
    "@timestamp" => 2019-03-19T05:39:26.714Z,
          "host" => "zzc-203",
       "message" => "183.60.92.253",
         "geoip" => {
         "country_code3" => "CN",
              "latitude" => 23.1167,
           "region_code" => "44",
           "region_name" => "Guangdong",
              "location" => {
            "lon" => 113.25,
            "lat" => 23.1167
        },
             "city_name" => "Guangzhou",
          "country_name" => "China",
        "continent_code" => "AS",
         "country_code2" => "CN",
              "timezone" => "Asia/Shanghai",
                    "ip" => "183.60.92.253",
             "longitude" => 113.25
    }
}

3.4 output配置

3.4.1 標(biāo)準(zhǔn)輸出stdout

前面已經(jīng)說到了,通常用于測試,如:

input {
    stdin {
        type => "std"
    }
}
output{stdout{codec=>rubydebug}}

3.4.2 file保存成文件

? 通過日志收集系統(tǒng)將分散在數(shù)百臺服務(wù)器上的數(shù)據(jù)集中存儲在某中心服務(wù)器上,這是運維最原始的需求。Logstash 當(dāng)然也能做到這點。例子

input {
        stdin {
                type => "std"
        }
}
output {
        file {
             # 表示年 月 日 主機
                path => "/tmp/%{+yyyy}-%{+MM}-%{+dd}-%{host}.log"
                codec => line {format => "%{message}"}
        }
}

輸入:this is hello world
[2019-09-07T12:08:45,327][INFO ][logstash.outputs.file    ] Opening file {:path=>"/tmp/2019-09-07-bigdata121.log"}
可以看到日志顯示,將內(nèi)容保存到 /tmp/2019-09-07-bigdata121.log 中
接著看看這個文件的內(nèi)容,就是我們輸入的內(nèi)容

3.4.3 通過端口讀取數(shù)據(jù)

接收日志服務(wù)器配置:
input {
  tcp {
    mode => "server"
    port => 9600
    ssl_enable => false
  }
}
filter {
    json {
        source => "message"
    }
}
output {
    file {
        path => "/home/hduser/app/logstash-6.6.2/data_test/%{+YYYY-MM-dd}/%{servip}-%{filename}"
        codec => line { format => "%{message}"}
    }
}

發(fā)送日志服務(wù)器配置:
input{
    file {
        path => ["/home/hduser/app/logstash-6.6.2/data_test/send.log"]
        type => "ecolog"
        start_position => "beginning"
    }
}
filter {
    if [type] =~ /^ecolog/ {
        ruby {
            code => "file_name = event.get('path').split('/')[-1]
                     event.set('file_name',file_name)
                     event.set('servip','接收方ip')"
        }
        mutate {
            rename => {"file_name" => "filename"}
        }
    }
}
output {
    tcp {
        host  => "接收方ip"
        port  => 9600
        codec => json_lines
    }
}

從發(fā)送方發(fā)送message,接收方可以看到寫出文件。

3.4.4 寫入到ES

例子:將文件內(nèi)容寫入到es
input {
    file {
        path => ["/usr/local/logstash-6.6.2/data_test/run_error.log"]
        # index和type名字中不能有大寫
        type => "error"
        start_position => "beginning"
}

}
output {
    elasticsearch {
        # ES的serverip列表
        hosts => ["192.168.109.133:9200"] 
        # 寫入的index的名稱
        index => "logstash-%{type}-%{+YYYY.MM.dd}"
        # type
        document_type => "%{type}"
        # 當(dāng)上面的es節(jié)點無法使用,是否尋找其他es節(jié)點
        sniffing => true
        # 是否重寫模板
        template_overwrite => true
    }
}

有個小問題:
當(dāng)日志中一行的內(nèi)容過長時,在日志文件中會寫成多行的形式。但是默認(rèn)寫入到es中時,是每一行就當(dāng)做document來寫入,而我們想要的是一條完整的日志作為一個document來寫入。這時候就需要 codec的一個模塊 multiline,例子

input {
? ? ? ? file {
? ? ? ? ? ? ? ? path =>"/the path/tmp.log"
? ? ? ? ? ? ? ? #若日志為多行信息顯示,需要codec配置
? ? ? ? ? ? ? ? codec => multiline? {
? ? ? ? ? ? ? ? ? ? ? ? pattern => "^\["  表示[ 開頭的才是新的一條日志
? ? ? ? ? ? ? ? ? ? ? ? negate => true
? ? ? ? ? ? ? ? ? ? ? ? what => "previous"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? start_position=>"beginning"? ?
? ? ? ? }
? ? ? }
# filter為logstash的解析日志模塊? ??
filter {
? ? ? # 解析日志生成相關(guān)的IP,訪問地址,日志級別
? ? ? grok {

? ? ? ? match => {?
? ? ? ? ? ? ? "message" => "%{SYSLOG5424SD:time} %{IP:hostip} %{URIPATHPARAM:url}\s*%{LOGLEVEL:loglevel}"?
? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? }
? ? ? #解析log生成的時間為時間戳
? ? ? grok{
? ? ? ? match => {
? ? ? ? ? ? ? "message" => "%{TIMESTAMP_ISO8601:log_create_date}"
? ? ? ? ? ? ? ? ?}
? ? ? ? }
? ? ? # 替換插入信息的時間戳為日志生成的時間戳
? ? ? date {
? ? ? ? ? ? ? match => ["log_create_date", "yyyy-MM-dd HH:mm:ss" ]
? ? ? ? ? ? ? target => "@timestamp"?
? ? ? ? }
? ? }

#定義日志輸出的配置,此處為寫入解析結(jié)果到es集群
output {
? ? elasticsearch {
? ? ? hosts => ["ip:9200"]? ? 
? ? ? index => "system-log"? 
? ? ? ? ? ? ? ? ? }
? ? ? }
? ? ? 
================================================
主要是input這一段的codec配置
input {
? ? ? ? file {
? ? ? ? ? ? ? ? path =>"/the path/tmp.log"
? ? ? ? ? ? ? ? #若日志為多行信息顯示,需要codec配置
? ? ? ? ? ? ? ? codec => multiline? {
? ? ? ? ? ? ? ? ? ? ? ? pattern => "^\[" 
? ? ? ? ? ? ? ? ? ? ? ? negate => true
? ? ? ? ? ? ? ? ? ? ? ? what => "previous"
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? start_position=>"beginning"? ?
? ? ? ? }
 }

 pattern => "^\[" 
 默認(rèn)是換行符分隔行,現(xiàn)在可以使用正則匹配來指定自定義的分隔符,作為一行
 negate => true
 如果前面的匹配成功了,true就表示取反,false表示維持原來的值,默認(rèn)是false
 what => "previous"或者“next”
 匹配到的內(nèi)容是屬于上一個event還是下一個event

分享文章:二、logstash原理和使用
轉(zhuǎn)載注明:http://muchs.cn/article18/gesggp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)標(biāo)簽優(yōu)化、軟件開發(fā)域名注冊、靜態(tài)網(wǎng)站、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)