Logstash 參考指南(使用Logstash解析日誌)

使用Logstash解析日誌

儲存你的第一個事件中,你建立了一個基本的Logstash管道來測試你的Logstash設置,在現實狀況中,Logstash管道要複雜一些:它一般有一個或多個輸入、過濾器和輸出插件。html

在本節中,你將建立一個Logstash管道,該管道使用Filebeat將Apache web日誌做爲輸入,解析這些日誌以從日誌中建立特定的、命名的字段,並將解析後的數據寫入到Elasticsearch集羣中,與其在命令行中定義管道配置,不如在配置文件中定義管道。git

首先,到這裏下載本示例中使用的示例數據集,而後解壓文件。web

配置Filebeat,將日誌行發送到Logstash

在建立Logstash管道以前,你將配置Filebeat將日誌行發送到Logstash,Filebeat客戶端是一個輕量級的、資源友好的工具,它從服務器上的文件收集日誌,並將這些日誌轉發給你的Logstash實例進行處理。Filebeat是爲可靠性和低延遲而設計的,Filebeat在主機上佔用的資源較少,而Beats input插件將Logstash實例上的資源需求最小化。ubuntu

在一個典型的用例中,Filebeat運行在一臺單獨的機器上,而不是運行Logstash實例的機器上,爲了本教程的目的,Logstash和Filebeat在同一臺機器上運行。

默認的Logstash安裝包含Beats input插件,Beats input插件容許Logstash從Elastic Beats框架接收事件,也就是說任何Beat written使用Beats框架工做,例如Packetbeat和Metricbeat,也能夠將事件數據發送到Logstash。segmentfault

要在數據源機器上安裝Filebeat,請從Filebeat產品頁面下載適當的包。你還能夠參考Beats文檔中的Filebeat入門來得到更多的安裝說明。ruby

安裝Filebeat後,須要對其進行配置,打開位於Filebeat安裝目錄中的filebeat.yml文件,並將內容替換爲如下幾行,確保paths指向Apache日誌示例文件logstash-tutorial.log,那是你先前下載的日誌:服務器

filebeat.prospectors:
- type: log
  paths:
    - /path/to/file/logstash-tutorial.log 
output.logstash:
  hosts: ["localhost:5044"]
paths => Filebeat處理的文件的絕對路徑

保存你的更改。app

爲了簡化配置,你不會像在現實場景中那樣指定TLS/SSL設置。框架

在數據源機器上,使用如下命令運行Filebeat:frontend

sudo ./filebeat -e -c filebeat.yml -d "publish"
若是以root身份運行Filebeat,則須要更改配置文件的全部權(請參閱Beats平臺參考中的 配置文件全部權和權限)。

Filebeat將嘗試在端口5044上鍊接,在使用活動的Beats插件開始以前,該端口上不會有任何響應,所以你看到的任何關於在該端口上鍊接失敗的消息目前都是正常的。

爲Filebeat輸入配置Logstash

接下來,你將建立一個Logstash配置管道,使用Beats input插件從Beats接收事件。

下面的文本表示配置管道的結構:

# The # character at the beginning of a line indicates a comment. Use
# comments to describe your configuration.
input {
}
# The filter part of this file is commented out to indicate that it is
# optional.
# filter {
#
# }
output {
}

這個結構是非功能性的,由於輸入和輸出部分沒有定義任何有效的選項。

爲了開始,在你的Logstash主目錄中,複製並粘貼配置管道結構到一個文件中,並命名爲first-pipeline.conf

接下來,經過添加如下幾行到first-pipeline.conf文件中的input部分來配置你的Logstash實例來使用Beats輸入插件:

beats {
   port => "5044"
}

稍後你將配置Logstash以寫入到Elasticsearch,如今,你能夠向output部分添加如下一行,以便在運行Logstash時將輸出打印到stdout:

stdout { codec => rubydebug }

當你完成後,first-pipeline.conf文件內容應該看起來向這樣:

input {
    beats {
        port => "5044"
    }
}
# The filter part of this file is commented out to indicate that it is
# optional.
# filter {
#
# }
output {
    stdout { codec => rubydebug }
}

要驗證你的配置,請運行如下命令:

bin/logstash -f first-pipeline.conf --config.test_and_exit

--config.test_and_exit選項解析配置文件並報告任何錯誤。

若是配置文件經過了配置測試,則使用如下命令啓動Logstash:

bin/logstash -f first-pipeline.conf --config.reload.automatic

--config.reload.automatic選項容許自動從新加載配置文件,這樣你沒必要在每次修改配置文件時中止並從新啓動Logstash。

當Logstash啓動時,你可能會看到一個或多個關於Logstash忽略pipelines.yml文件的警告消息,你能夠忽略這個警告,pipelines.yml文件用於在一個Logstash實例中運行多個管道,對於這裏顯示的示例,你正在運行一個管道。

若是你的管道工做正常,你應該會看到一系列事件,以下面寫到控制檯的:

{
    "@timestamp" => 2017-11-09T01:44:20.071Z,
        "offset" => 325,
      "@version" => "1",
          "beat" => {
            "name" => "My-MacBook-Pro.local",
        "hostname" => "My-MacBook-Pro.local",
         "version" => "6.0.0"
    },
          "host" => "My-MacBook-Pro.local",
    "prospector" => {
        "type" => "log"
    },
        "source" => "/path/to/file/logstash-tutorial.log",
       "message" => "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1\" 200 203023 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
          "tags" => [
        [0] "beats_input_codec_plain_applied"
    ]
}
...

使用Grok過濾器插件解析Web日誌

如今你有了一個能夠從Filebeat讀取日誌行的工做管道,可是你會注意到日誌消息的格式並不理想,你但願解析日誌消息,以便從日誌中建立特定的、命名的字段,爲此你將使用grok過濾器插件。

grok過濾器插件是在Logstash中默承認用的幾個插件之一,有關如何管理Logstash插件的詳細信息,請參閱插件管理器的參考文檔

grok過濾器插件容許你將非結構化日誌數據解析爲結構化和可查詢的數據。

由於grok過濾器插件在傳入的日誌數據中尋找模式,配置插件須要你決定關於如何定義對你的用例有意義的模式,web服務器日誌示例表明性的行以下:

83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png
HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel
Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"

行開頭的IP地址很容易識別,方括號中的時間戳也很容易識別,要解析數據,可使用%{COMBINEDAPACHELOG} grok模式,該模式使用如下模式來構造來自Apache日誌的行:

信息 字段名
IP Address clientip
User ID ident
User Authentication auth
timestamp timestamp
HTTP Verb verb
Request body request
HTTP Version httpversion
HTTP Status Code response
Bytes served bytes
Referrer URL referrer
User agent agent
若是你須要幫助構建grok模式,請嘗試使用 grok調試器,Grok調試器是基本許可證下的X-Pack特性,所以能夠 無償使用

編輯first-pipeline.conf文件,用如下文本替換整個filter部分:

filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
}

完成後,first-pipeline.conf的內容應該看起來像這樣:

input {
    beats {
        port => "5044"
    }
}
filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
}
output {
    stdout { codec => rubydebug }
}

保存你的更改,由於你已經啓用了自動配置重載,你沒必要從新啓動Logstash來獲取更改,可是,你須要強制Filebeat來從頭讀取日誌文件。要作到這一點,請轉到正在運行Filebeat的終端窗口並按Ctrl+C關閉Filebeat,而後刪除Filebeat註冊表文件,例如,運行:

sudo rm data/registry

因爲Filebeat存儲它在註冊表中獲取的每一個文件的狀態,所以刪除註冊表文件將迫使Filebeat從頭讀取它正在獲取的全部文件。

接下來,使用如下命令從新啓動Filebeat:

sudo ./filebeat -e -c filebeat.yml -d "publish"

若是須要等待Logstash從新加載配置文件,那麼在Filebeat開始處理事件以前可能會有一點延遲。

Logstash應用grok模式後,事件將會有如下JSON表示:

{
        "request" => "/presentations/logstash-monitorama-2013/images/kibana-search.png",
          "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
         "offset" => 325,
           "auth" => "-",
          "ident" => "-",
           "verb" => "GET",
     "prospector" => {
        "type" => "log"
    },
         "source" => "/path/to/file/logstash-tutorial.log",
        "message" => "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1\" 200 203023 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
           "tags" => [
        [0] "beats_input_codec_plain_applied"
    ],
       "referrer" => "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
     "@timestamp" => 2017-11-09T02:51:12.416Z,
       "response" => "200",
          "bytes" => "203023",
       "clientip" => "83.149.9.216",
       "@version" => "1",
           "beat" => {
            "name" => "My-MacBook-Pro.local",
        "hostname" => "My-MacBook-Pro.local",
         "version" => "6.0.0"
    },
           "host" => "My-MacBook-Pro.local",
    "httpversion" => "1.1",
      "timestamp" => "04/Jan/2015:05:13:42 +0000"
}

注意,該事件包含原始消息,可是日誌消息也被分解爲特定的字段。

使用Geoip過濾器插件加強數據

除了解析日誌數據以得到更好的搜索以外,過濾器插件能夠從現有數據中得到補充信息,做爲一個例子,geoip插件查找IP地址,從地址中獲取地理位置信息,並將該位置信息添加到日誌中。

經過向first-pipeline.conf文件的filter部分添加如下代碼行,配置你的Logstash實例以使用geoip過濾器插件:

geoip {
  source => "clientip"
}

geoip插件配置要求你指定包含要查找的IP地址的源字段的名稱來查找,在本例中,clientip字段包含IP地址。

由於過濾器是按順序計算的,確保geoip部分位於配置文件的grok部分以後,而且grokgeoip部分都嵌套在filter部分中。

當你完成後,first-pipeline.conf的內容看起來想這樣:

input {
    beats {
        port => "5044"
    }
}
 filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
    geoip {
        source => "clientip"
    }
}
output {
    stdout { codec => rubydebug }
}

保存你的更改,如前所述,要強制Filebeat從頭讀取日誌文件,請關閉Filebeat(按Ctrl+C),刪除註冊表文件,而後使用如下命令從新啓動Filebeat:

sudo ./filebeat -e -c filebeat.yml -d "publish"

注意,事件如今包含地理位置信息:

{
        "request" => "/presentations/logstash-monitorama-2013/images/kibana-search.png",
          "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
          "geoip" => {
              "timezone" => "Europe/Moscow",
                    "ip" => "83.149.9.216",
              "latitude" => 55.7485,
        "continent_code" => "EU",
             "city_name" => "Moscow",
          "country_name" => "Russia",
         "country_code2" => "RU",
         "country_code3" => "RU",
           "region_name" => "Moscow",
              "location" => {
            "lon" => 37.6184,
            "lat" => 55.7485
        },
           "postal_code" => "101194",
           "region_code" => "MOW",
             "longitude" => 37.6184
    },
    ...

將數據索引到Elasticsearch中

如今web日誌被分解成特定的字段,Logstash管道能夠將數據索引到一個Elasticsearch集羣中。

你能夠在本身的硬件上運行Elasticsearch,或者在Elastic Cloud上使用咱們 託管的Elasticsearch服務,Elasticsearch服務在AWS和GCP上均可用, 免費試用Elasticsearch服務

Logstash管道能夠將數據索引到Elasticsearch集羣,編輯first-pipeline.conf文件並將整個output部分替換爲如下文本:

output {
    elasticsearch {
        hosts => [ "localhost:9200" ]
    }
}

使用這個配置,Logstash使用http協議鏈接到Elasticsearch,上面的例子假設在相同的實例上運行了Logstash和Elasticsearch。你可使用hosts配置指定一個遠程的Elasticsearch實例:hosts => [ "es-machine:9092" ]

此時,你的first-pipeline.conf文件已經正確配置了輸入、過濾器和輸出部分,而且看起來像這樣:

input {
    beats {
        port => "5044"
    }
}
 filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
    geoip {
        source => "clientip"
    }
}
output {
    elasticsearch {
        hosts => [ "localhost:9200" ]
    }
}

保存你的更改,如前所述,要強制Filebeat從頭讀取日誌文件,請關閉Filebeat(按Ctrl+C),刪除註冊表文件,而後使用如下命令從新啓動Filebeat:

sudo ./filebeat -e -c filebeat.yml -d "publish"

測試你的管道

如今已經配置了Logstash管道將數據索引到一個Elasticsearch集羣中,你能夠查詢Elasticsearch。

嘗試一個基於grok過濾器插件建立的字段的Elasticsearch測試查詢,將$DATE替換爲當前日期,使用YYYY.MM.DD格式:

curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=response=200'
索引名中使用的日期基於UTC,而不是Logstash運行所在的時區,若是查詢返回 index_not_found_exception,請確保 logstash-$DATE反映了索引的實際名稱,要查看可用索引的列表,可使用這個查詢: curl 'localhost:9200/_cat/indices?v'

你應該獲得多份命中返回,例如:

{
  "took": 50,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 98,
    "max_score": 2.793642,
    "hits": [
      {
        "_index": "logstash-2017.11.09",
        "_type": "doc",
        "_id": "3IzDnl8BW52sR0fx5wdV",
        "_score": 2.793642,
        "_source": {
          "request": "/presentations/logstash-monitorama-2013/images/frontend-response-codes.png",
          "agent": """"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"""",
          "geoip": {
            "timezone": "Europe/Moscow",
            "ip": "83.149.9.216",
            "latitude": 55.7485,
            "continent_code": "EU",
            "city_name": "Moscow",
            "country_name": "Russia",
            "country_code2": "RU",
            "country_code3": "RU",
            "region_name": "Moscow",
            "location": {
              "lon": 37.6184,
              "lat": 55.7485
            },
            "postal_code": "101194",
            "region_code": "MOW",
            "longitude": 37.6184
          },
          "offset": 2932,
          "auth": "-",
          "ident": "-",
          "verb": "GET",
          "prospector": {
            "type": "log"
          },
          "source": "/path/to/file/logstash-tutorial.log",
          "message": """83.149.9.216 - - [04/Jan/2015:05:13:45 +0000] "GET /presentations/logstash-monitorama-2013/images/frontend-response-codes.png HTTP/1.1" 200 52878 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"""",
          "tags": [
            "beats_input_codec_plain_applied"
          ],
          "referrer": """"http://semicomplete.com/presentations/logstash-monitorama-2013/"""",
          "@timestamp": "2017-11-09T03:11:35.304Z",
          "response": "200",
          "bytes": "52878",
          "clientip": "83.149.9.216",
          "@version": "1",
          "beat": {
            "name": "My-MacBook-Pro.local",
            "hostname": "My-MacBook-Pro.local",
            "version": "6.0.0"
          },
          "host": "My-MacBook-Pro.local",
          "httpversion": "1.1",
          "timestamp": "04/Jan/2015:05:13:45 +0000"
        }
      },
    ...

嘗試另外一個搜索從IP地址派生的地理信息,將$DATE替換爲當前日期,使用YYYY.MM.DD格式:

curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=geoip.city_name=Buffalo'

一些日誌條目來自Buffalo,所以查詢產生如下響應:

{
  "took": 9,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 2.6390574,
    "hits": [
      {
        "_index": "logstash-2017.11.09",
        "_type": "doc",
        "_id": "L4zDnl8BW52sR0fx5whY",
        "_score": 2.6390574,
        "_source": {
          "request": "/blog/geekery/disabling-battery-in-ubuntu-vms.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29",
          "agent": """"Tiny Tiny RSS/1.11 (http://tt-rss.org/)"""",
          "geoip": {
            "timezone": "America/New_York",
            "ip": "198.46.149.143",
            "latitude": 42.8864,
            "continent_code": "NA",
            "city_name": "Buffalo",
            "country_name": "United States",
            "country_code2": "US",
            "dma_code": 514,
            "country_code3": "US",
            "region_name": "New York",
            "location": {
              "lon": -78.8781,
              "lat": 42.8864
            },
            "postal_code": "14202",
            "region_code": "NY",
            "longitude": -78.8781
          },
          "offset": 22795,
          "auth": "-",
          "ident": "-",
          "verb": "GET",
          "prospector": {
            "type": "log"
          },
          "source": "/path/to/file/logstash-tutorial.log",
          "message": """198.46.149.143 - - [04/Jan/2015:05:29:13 +0000] "GET /blog/geekery/disabling-battery-in-ubuntu-vms.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29 HTTP/1.1" 200 9316 "-" "Tiny Tiny RSS/1.11 (http://tt-rss.org/)"""",
          "tags": [
            "beats_input_codec_plain_applied"
          ],
          "referrer": """"-"""",
          "@timestamp": "2017-11-09T03:11:35.321Z",
          "response": "200",
          "bytes": "9316",
          "clientip": "198.46.149.143",
          "@version": "1",
          "beat": {
            "name": "My-MacBook-Pro.local",
            "hostname": "My-MacBook-Pro.local",
            "version": "6.0.0"
          },
          "host": "My-MacBook-Pro.local",
          "httpversion": "1.1",
          "timestamp": "04/Jan/2015:05:29:13 +0000"
        }
      },
     ...

若是你正在使用Kibana來可視化你的數據,你還能夠在Kibana中探索Filebeat數據:

kibana-filebeat-data.png

有關如何爲Filebeat加載Kibana索引模式的信息,請參見Filebeat入門文檔

你已經成功地建立了一個管道,它使用Filebeat將Apache web日誌做爲輸入,解析這些日誌以建立特定的日誌,從日誌中命名字段,並將解析後的數據寫入到Elasticsearch集羣。接下來,你將瞭解如何建立使用多個輸入和輸出插件的管道。

相關文章
相關標籤/搜索