本文翻譯自: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
在建立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端口上創建鏈接失敗的信息都是正常的。
接下來,你要建立一個以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"
]
}
複製代碼
如今你有了一個能夠從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
插件查找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
},
...
複製代碼
到如今,你已經將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讀取的數據:
可閱讀 Filebeat使用文檔獲取有關Kibana加載Filebeat索引的信息。你已經成功的建立了一個管道,使用Filebeat讀取Apache web日誌信息做爲輸入,解析日誌建立指定字段,並將解析後的日誌數據輸出到Elasticsearch集羣中。下一步,你將學習如何建立一個使用多個輸入輸出插件的管道。
關注微信公衆號,按期推送文章!