使用Logstash解析日誌

本文翻譯自:Logstash Reference [6.5] » Getting Started with Logstash » Parsing Logs with Logstash,我的水平有限,不正確之處望指正。html

存儲你的第一個事件一節中,咱們建立了一個簡單的Logstash管道示例來測試你已安裝運行的Logstash。在生產環境中,Logstash管道會很是複雜:通常包含一個或多個輸入,過濾器,輸出插件。git

在本章節,你將建立一個Logstash管道:Filebeat採集Apache web日誌數據做爲輸入,解析輸入的日誌,建立特定的字段,而後將解析後的數據寫入Elasticsearch集羣中。您將在配置文件中進行Logstash管道的配置而不是在命令行中配置。web

接下來,點擊這裏下載示例數據,解壓文件。ubuntu

配置Filebeat發送日誌到Logstash

在建立Logstash管道以前,你須要配置Filebeat以將日誌發送到Logstash中。Filebeat是輕量級,資源佔用較低的日誌收集工具,從各服務器上收集日誌並將這些日誌發送到Logstash實例中處理。Filebeat專爲可靠性和低延時而設計。Filebeat只佔用不多的主機資源,從而Beat輸入插件有效的下降了Logstash實例的資源需求。ruby

在典型應用中,Filebeat與Logstash是部署在不一樣的主機上的。這裏出於教程簡便的目的,將它們部署在同一臺主機上。bash

Logstash默認安裝已含有Beat input插件。Beat輸入插件使Logstash能夠從Elastic Beat框架接收事件,這意味者任何編寫爲與Beat框架一塊兒工做的Beat(如Packetbeat和Metricbeat)均可以將事件數據發送到Logstash。服務器

要在數據源主機上安裝Filebeat,能夠在Filebeat產品頁中下載對應的安裝包。也能夠參閱Filebeat入門獲取其餘安裝說明。微信

安裝好Filebeat後,須要對其進行配置。在Filebeat安裝目錄中找到並打開filebeat.yml文件,替換以下行中的配置項。確保paths項爲先前下載的Apache示例日誌文件(logstash-tutorial.log)路徑。app

filebeat.prospectors:
- type: log
  paths:
    - /path/to/file/logstash-tutorial.log  # 須填寫絕對路徑
output.logstash:
  hosts: ["localhost:5044"]
複製代碼

保存配置。爲了簡化配置,無需配置生成環境中經常使用TLS/SSL配置。框架

在數據源主機上,輸入如下命令運行Filebeat:

sudo ./filebeat -e -c filebeat.yml -d "publish"
複製代碼

若是以root身份運行Filebeat,則須要更改配置文件的全部權(請參閱Config File Ownership and Permissions)。

Filebeat將嘗試在端口5044上創建鏈接。在Logstash啓動一個激活狀態的Beats插件前,該端口上沒有任何響應,因此在輸入插件處於未激活狀態前你看到的在5044端口上創建鏈接失敗的信息都是正常的。

爲Logstash配置Filebeat輸入

接下來,你要建立一個以Beats輸入插件做爲輸入接收來自Beats的事件的Logstash管道配置。

如下的一段內容爲一個管道配置的框架:

# 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文件的輸入部分,將Logstash實例配置爲使用Beats做爲輸入插件:

beats {
        port => "5044"
    }
複製代碼

後面你會配置Logstash輸出到Elasticsearch中。目前,你能夠先在輸出部分添加下面幾行配置使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}模式,用下表的形式結構化Apache日誌行:

Information Field Name
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註冊表文件registry。 例如,運行:

sudo rm data/registry
複製代碼

因爲Filebeat在註冊表文件中存儲了每一個文件被讀取後的狀態,刪除註冊表文件將強制Filebea從頭開始讀取文件。下一步,用下面的命令重啓Filebeat:

sudo ./filebeat -e -c filebeat.yml -d "publish"
複製代碼

若是Filebeat在開始處理事件以前須要等待Logstash從新加載配置文件,則可能會有點延時。在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地址,從地址中獲取地理位置信息,並將該位置信息添加到日誌中。

使用geoip插件配置你的Logstash實例,在first-pipeline.conf配置文件的filter部分添加以下行:

geoip {
        source => "clientip"
    }
複製代碼

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

因爲過濾器是按序處理的,在配置文件中請確保geoip部分在grok部分以後,而且都在filter內部。

當你完成這步後,first-pipeline.conf內容應該以下:

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

保存更改。如以前所作的那樣,爲了強制Filebeat從頭開始讀取日誌文件,關閉Filebeat(Ctrl+C),刪除register註冊表文件,運行如下命令重啓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日誌數據解析爲各個字段,能夠將數據輸出到Elasticsearch中了。

你能夠在本身的主機上運行Elasticsearch,也能夠在Elastic Cloud上使用咱們託管的Elasticsearch Service。 AWS和GCP均提供Elasticsearch服務。 免費試用Elasticsearch服務

Logstash管道能夠將數據索引到Elasticsearch集羣中。編輯first-pipeline.conf配置文件,將輸出部分替換爲以下內容:

output {
    elasticsearch {
        hosts => [ "localhost:9200" ]
    }
}
複製代碼

在此配置中,Logstash使用http協議與Elasticsearch創建鏈接。上面的示例假定Logstash與Elasticsearch運行在同一臺主機中。你能夠經過hosts配置項進行相似hosts => [ "es-machine:9092" ]的配置去鏈接一個遠端運行的Elasticsearch實例。

到這裏,first-pipeline.conf配置文件中input、filter、output都有了適當的配置,配置內容以下:

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

保存更改。如以前所作的那樣,爲了強制Filebeat從頭開始讀取日誌文件,關閉Filebeat(Ctrl+C),刪除register註冊表文件,運行如下命令重啓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-$DATA是正確的索引名。查看當前可用索引列表,可用此進行查詢: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讀取的數據:

image
可閱讀 Filebeat使用文檔獲取有關Kibana加載Filebeat索引的信息。

你已經成功的建立了一個管道,使用Filebeat讀取Apache web日誌信息做爲輸入,解析日誌建立指定字段,並將解析後的日誌數據輸出到Elasticsearch集羣中。下一步,你將學習如何建立一個使用多個輸入輸出插件的管道。

關注微信公衆號,按期推送文章!

相關文章
相關標籤/搜索