天天看點

Logstash

Logstash介紹

Logstash是一個開源資料收集引擎,具有實時管道功能。Logstash可以動态地将來自不同資料源的資料統一起來,并将資料标準化到你所選擇的目的地。

Logstash

集中、轉換和存儲你的資料

 Logstash是一個開源的伺服器端資料處理管道,可以同時從多個資料源擷取資料,并對其進行轉換,然後将其發送到你最喜歡的“存儲”。(當然,我們最喜歡的是Elasticsearch)

輸入:采集各種樣式、大小和來源的資料

資料往往以各種各樣的形式,或分散或集中地存在于很多系統中。Logstash 支援各種輸入選擇 ,可以在同一時間從衆多常用來源捕捉事件。能夠以連續的流式傳輸方式,輕松地從您的日志、名額、Web 應用、資料存儲以及各種 AWS 服務采集資料。

Logstash

過濾器:實時解析和轉換資料

資料從源傳輸到存儲庫的過程中,Logstash 過濾器能夠解析各個事件,識别已命名的字段以建構結構,并将它們轉換成通用格式,以便更輕松、更快速地分析和實作商業價值。

Logstash 能夠動态地轉換和解析資料,不受格式或複雜度的影響:

  • 利用 Grok 從非結構化資料中派生出結構
  • 從 IP 位址破譯出地理坐标
  • 将 PII 資料匿名化,完全排除敏感字段
  • 整體處理不受資料源、格式或架構的影響
Logstash

輸出:選擇你的存儲,導出你的資料

盡管 Elasticsearch 是我們的首選輸出方向,能夠為我們的搜尋和分析帶來無限可能,但它并非唯一選擇。

Logstash 提供衆多輸出選擇,您可以将資料發送到您要指定的地方,并且能夠靈活地解鎖衆多下遊用例。

Logstash

安裝Logstash

Logstash

首先,讓我們通過最基本的Logstash管道來測試一下剛才安裝的Logstash

Logstash管道有兩個必需的元素,輸入和輸出,以及一個可選元素過濾器。輸入插件從資料源那裡消費資料,過濾器插件根據你的期望修改資料,輸出插件将資料寫入目的地。

Logstash

接下來,允許Logstash最基本的管道,例如:

bin/logstash -e 'input { stdin {} } output { stdout {} }'      

(畫外音:選項 -e 的意思是允許你從指令行指定配置)

啟動以後,下面我們在指令行下輸入"hello world"

Logstash

用Logstash解析日志

 在上一小節中,你已經建立了一個基本的Logstash管道來測試你的Logstash設定。在現實世界中,一個Logstash管理會稍微複雜一些:它通常有一個或多個input, filter 和 output 插件。

在這一小節中,你将建立一個Logstash管道,并且使用Filebeat将Apache Web日志作為input,解析這些日志,然後将解析的資料寫到一個Elasticsearch叢集中。你将在配置檔案中定義管道,而不是在指令行中定義管道配置。

在開始之前,請先下載下傳示例資料。

配置Filebeat來發送日志行到Logstash

在你建立Logstash管道之前,你需要先配置Filebeat來發送日志行到Logstash。Filebeat用戶端是一個輕量級的、資源友好的工具,它從伺服器上的檔案中收集日志,并将這些日志轉發到你的Logstash執行個體以進行處理。Filebeat設計就是為了可靠性和低延遲。Filebeat在主機上占用的資源很少,而且Beats input插件将對Logstash執行個體的資源需求降到最低。

(畫外音:注意,在一個典型的用例中,Filebeat和Logstash執行個體是分開的,它們分别運作在不同的機器上。在本教程中,Logstash和Filebeat在同一台機器上運作。)

關于Filebeat請參考《開始使用Filebeat》

Logstash

第1步:配置filebeat.yml

filebeat.inputs:
- type: log
  paths:
    - /usr/local/programs/logstash/logstash-tutorial.log

output.logstash:
  hosts: ["localhost:5044"]      

第2步:在logstash安裝目錄下建立一個檔案first-pipeline.conf

Logstash

(畫外音:剛才說過了通常Logstash管理有三部分(輸入、過濾器、輸出),這裡input下面beats { port => "5044" }的意思是用Beats輸入插件,而stdout { codec => rubydebug }的意思是輸出到控制台)

第3步:檢查配置并啟動Logstash

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

(畫外音:--config.test_and_exit選項的意思是解析配置檔案并報告任何錯誤)

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

(畫外音:--config.reload.automatic選項的意思是啟用自動配置加載,以至于每次你修改完配置檔案以後無需停止然後重新開機Logstash)

第4步:啟動filebeat

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

如果一切正常,你将會在Logstash控制台下看到類似這樣的輸出:

Logstash

用Grok過濾器插件解析日志

現在你有了一個工作管道,可以從Filebeat讀取日志行。但是你可能已經注意到日志消息的格式并不理想。你想要解析日志消息,以便從日志中建立特定的、命名的字段。為此,您将使用grok filter插件。

grok 過濾器插件是Logstash中預設可用的幾個插件之一。

grok 過濾器插件允許你将非結構化日志資料解析為結構化和可查詢的資料。

因為 grok 過濾器插件在傳入的日志資料中查找模式

為了解析資料,你可以用 %{COMBINEDAPACHELOG} grok pattern ,這種模式(或者說格式)的schema如下:

Logstash

接下來,編輯first-pipeline.conf檔案,加入grok filter,在你修改完以後這個檔案看起來應該是這樣的:

Logstash

在你儲存完以後,因為你已經啟動了自動加載配置,是以你不需要重新開機Logstash來應用你的修改。但是,你确實需要強制Filebeat從頭讀取日志檔案。為了這樣做,你需要在終端先按下Ctrl+C停掉Filebeat,然後删除Filebeat注冊檔案。例如:

rm data/registr      
Logstash

然後重新開機Filebeat

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

此時,再看Logstash控制台,輸出可能是這樣的:

Logstash

用 Geoip 過濾器插件增強你的資料

Logstash

然後,同樣地,重新開機Filebeat

Ctrl+C

rm data/registry

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

再次檢視Logstash控制台,我們會發現多了地理位置資訊:

Logstash

索引你的資料到Elasticsearch

在之前的配置中,我們配置了Logstash輸出到控制台,現在我們讓它輸出到Elasticsearch叢集。

編輯first-pipeline.conf檔案,替換output區域為:

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

在這段配置中,Logstash用http協定連接配接到Elasticsearch,而且假設Logstash和Elasticsearch允許在同一台機器上。你也可以指定一個遠端的Elasticsearch執行個體,比如host=>["es-machine:9092"]

現在,first-pipeline.conf檔案是這樣的:

Logstash

同樣,儲存改變以後,重新開機Filebeat

(畫外音:首先,Ctrl+C終止Filebeat;接着rm data/registry删除注冊檔案;最後,./filebeat -e -c filebeat.yml -d "publish" 啟動Filebeat)

好了,接下來啟動Elasticsearch

Logstash

(畫外音:檢視Elasticsearch索引,如果沒有看到logstash的索引,那麼重新開機Filebeat和Logstash,重新開機之後應該就可以看到了)

如果一切正常的話,可以在Elasticsearch的控制台日志中看到這樣的輸出:

[2018-08-11T17:35:27,871][INFO ][o.e.c.m.MetaDataIndexTemplateService] [Px524Ts] adding template [logstash] for index patterns [logstash-*]
[2018-08-11T17:46:13,311][INFO ][o.e.c.m.MetaDataCreateIndexService] [Px524Ts] [logstash-2018.08.11] creating index, cause [auto(bulk api)], templates [logstash], shards [5]/[1], mappings [_default_]
[2018-08-11T17:46:13,549][INFO ][o.e.c.m.MetaDataMappingService] [Px524Ts] [logstash-2018.08.11/pzcVdNxSSjGzaaM9Ib_G_w] create_mapping [doc]
[2018-08-11T17:46:13,722][INFO ][o.e.c.m.MetaDataMappingService] [Px524Ts] [logstash-2018.08.11/pzcVdNxSSjGzaaM9Ib_G_w] update_mapping [doc]      

這個時候,我們再檢視Elasticsearch的索引

請求:

curl 'localhost:9200/_cat/indices?v'      

響應:

health status index                     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   bank                      59jD3B4FR8iifWWjrdMzUg   5   1       1000            0    475.1kb        475.1kb
green  open   .kibana                   DzGTSDo9SHSHcNH6rxYHHA   1   0        153           23    216.8kb        216.8kb
yellow open   filebeat-6.3.2-2018.08.08 otgYPvsgR3Ot-2GDcw_Upg   3   1        255            0     63.7kb         63.7kb
yellow open   customer                  DoM-O7QmRk-6f3Iuls7X6Q   5   1          1            0      4.5kb          4.5kb
yellow open   logstash-2018.08.11       pzcVdNxSSjGzaaM9Ib_G_w   5   1        100            0    251.8kb        251.8kb      

可以看到有一個名字叫"logstash-2018.08.11"的索引,其它的索引都是之前建的不用管

接下來,檢視這個索引下的文檔

curl -X GET 'localhost:9200/logstash-2018.08.11/_search?pretty&q=response=200'      

響應大概是這樣的:

(畫外音:由于輸出太長了,這裡截取部分)

{
    "_index" : "logstash-2018.08.11",
    "_type" : "doc",
    "_id" : "D_JhKGUBOuOlYJNtDfwl",
    "_score" : 0.070617564,
    "_source" : {
      "host" : {
        "name" : "localhost.localdomain"
      },
      "httpversion" : "1.1",
      "ident" : "-",
      "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\"",
      "auth" : "-",
      "timestamp" : "04/Jan/2015:05:13:42 +0000",
      "input" : {
        "type" : "log"
      },
      "geoip" : {
        "postal_code" : "101194",
        "region_name" : "Moscow",
        "timezone" : "Europe/Moscow",
        "continent_code" : "EU",
        "city_name" : "Moscow",
        "country_code3" : "RU",
        "country_name" : "Russia",
        "ip" : "83.149.9.216",
        "country_code2" : "RU",
        "region_code" : "MOW",
        "latitude" : 55.7485,
        "longitude" : 37.6184,
        "location" : {
          "lon" : 37.6184,
          "lat" : 55.7485
        }
      },
      "@timestamp" : "2018-08-11T09:46:10.209Z",
      "offset" : 0,
      "tags" : [
        "beats_input_codec_plain_applied"
      ],
      "beat" : {
        "version" : "6.3.2",
        "hostname" : "localhost.localdomain",
        "name" : "localhost.localdomain"
      },
      "clientip" : "83.149.9.216",
      "@version" : "1",
      "verb" : "GET",
      "request" : "/presentations/logstash-monitorama-2013/images/kibana-search.png",
      "prospector" : {
        "type" : "log"
      },
      "referrer" : "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
      "response" : "200",
      "bytes" : "203023",
      "source" : "/usr/local/programs/logstash/logstash-tutorial.log",
      "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\""
    }
  }      

再來一個

curl -XGET 'localhost:9200/logstash-2018.08.11/_search?pretty&q=geoip.city_name=Buffalo'      
{
  "took" : 37,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 2.6855774,
    "hits" : [
      {
        "_index" : "logstash-2018.08.11",
        "_type" : "doc",
        "_id" : "DvJhKGUBOuOlYJNtDPw7",
        "_score" : 2.6855774,
        "_source" : {
          "host" : {
            "name" : "localhost.localdomain"
          },
          "httpversion" : "1.1",
          "ident" : "-",
          "message" : "198.46.149.143 - - [04/Jan/2015:05:29:13 +0000] \"GET /blog/geekery/solving-good-or-bad-problems.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29 HTTP/1.1\" 200 10756 \"-\" \"Tiny Tiny RSS/1.11 (http://tt-rss.org/)\"",
          "auth" : "-",
          "timestamp" : "04/Jan/2015:05:29:13 +0000",
          "input" : {
            "type" : "log"
          },
          "geoip" : {
            "postal_code" : "14202",
            "region_name" : "New York",
            "timezone" : "America/New_York",
            "continent_code" : "NA",
            "city_name" : "Buffalo",
            "country_code3" : "US",
            "country_name" : "United States",
            "ip" : "198.46.149.143",
            "dma_code" : 514,
            "country_code2" : "US",
            "region_code" : "NY",
            "latitude" : 42.8864,
            "longitude" : -78.8781,
            "location" : {
              "lon" : -78.8781,
              "lat" : 42.8864
            }
          },
          "@timestamp" : "2018-08-11T09:46:10.254Z",
          "offset" : 22795,
          "tags" : [
            "beats_input_codec_plain_applied"
          ],
          "beat" : {
            "version" : "6.3.2",
            "hostname" : "localhost.localdomain",
            "name" : "localhost.localdomain"
          },
          "clientip" : "198.46.149.143",
          "@version" : "1",
          "verb" : "GET",
          "request" : "/blog/geekery/solving-good-or-bad-problems.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29",
          "prospector" : {
            "type" : "log"
          },
          "referrer" : "\"-\"",
          "response" : "200",
          "bytes" : "10756",
          "source" : "/usr/local/programs/logstash/logstash-tutorial.log",
          "agent" : "\"Tiny Tiny RSS/1.11 (http://tt-rss.org/)\""
        }
      },
。。。      

(畫外音:關于Elasticsearch可以檢視另外一篇《Elasticsearch 快速開始》)

指令行啟動Logstash

為了從指令行啟動Logstash,用下面的指令:

bin/logstash [options]      

下面的例子展示了啟動Logstash,并制定配置定義在mypipeline.conf檔案中:

bin/logstash -f mypipeline.conf      

在指令行中設定的任何标志都會覆寫logstash.yml中的相應設定。但是檔案本身的内容沒有改變。

Command-Line Flags

--node.name NAME

  指定Logstash執行個體的名字。如果沒有指定的話,預設是目前主機名。

-f, --path.config CONFIG_PATH

  從指定的檔案或者目錄加載Logstash配置。如果給定的是一個目錄,則該目錄中的所有檔案将以字典順序連接配接,然後作為一個配置檔案進行解析。

-e, --config.string CONFIG_STRING

用給定的字元串作為配置資料,文法和配置檔案中是一樣的。

--modules

運作的子產品名字

-l, --path.logs PATH

Logstash内部日志輸出目錄

--log.level LEVEL

日志級别

-t, --config.test_and_exit

檢查配置文法是否正确并退出

-r, --config.reload.automatic

監視配置檔案的改變,并且當配置檔案被修改以後自動重新加載配置檔案。

-config.reload.interval RELOAD_INTERVAL

為了檢查配置檔案是否改變,而拉去配置檔案的頻率。預設3秒。

--http.host HTTP_HOST

Web API綁定的主機。REST端點綁定的位址。預設是"127.0.0.1"

--http.port HTTP_PORT

Web API http端口。REST端點綁定的端口。預設是9600-9700之間。

--log.format FORMAT

指定Logstash寫它自身的使用JSON格式還是文本格式。預設是"plain"。

--path.settings SETTINGS_DIR

設定包含logstash.yml配置檔案的目錄,比如log4j日志配置。也可以設定LS_SETTINGS_DIR環境變量。預設的配置目錄是在Logstash home目錄下。

-h, --help

列印幫助

好了,關于Logstash介紹暫時先寫這麼多吧! 感謝用心的自己!!!

其它相關

《Elasticsearch 快速開始》

《開始使用Filebeat》