標籤:

Logstash學習筆記

Table of Contents

  1. 背景
  2. 安裝
    1. 簡單使用示例
      1. 1.命令行輸入內容然後讓logstash輸出內容
      2. 2.命令行輸入內容然後讓logstash以某種格式輸出
      3. 3.命令行輸入內容然後讓logstash使用Elasticsearch存儲
      4. 4.使用過濾器解析日誌存到es中
      5. 5.從文件獲取日誌保存到es中
  1. logstash詳解
    1. 引言
    2. 架構
    3. 配置語法
    4. plugin的安裝
    5. 運行方式
    6. 插件配置
      1. 輸入插件(Input)
      2. 編碼插件(Codec)
      3. 過濾器插件(Filter)
      4. output配置

背景

先介紹下ELK stack

Elasticsearch

Elasticsearch 是基於 JSON 的分散式搜索和分析引擎,專為實現水平擴展、高可用和管理便捷性而設計

Logstash

Logstash 是動態數據收集管道,擁有可擴展的插件生態系統,能夠與 Elasticsearch 產生強大的協同作用。

Kibana

Kibana 能夠以圖表的形式呈現數據,並且具有可擴展的用戶界面,供您全方位配置和管理 Elastic Stack

ELK典型使用場景

用Elasticsearch作為後台數據的存儲,kibana用來前端的報表展示。Logstash在其過程中擔任搬運工的角色

我們先把logstash安裝然後簡單用起來,然後詳細解析logstash

安裝

依賴:jdk7及以上版本

Logstash版本:2.3.4

步驟:

  1. 官網下載tar.gz包

鏈接地址:鏈接

  1. 扔到機器上解壓tar zxvf logstash-2.3.4.tar.gz

安裝完成

簡單使用示例

1.命令行輸入內容然後讓logstash輸出內容

進到bin目錄下運行:

./logstash -e input { stdin { } } output { stdout {} }

logstach輸出:

Settings: Default pipeline workers: 2

Pipeline main started

表示啟動成功

在控制台輸入123,然後logstash輸出如下:

123

2017-11-02T02:42:50.836Z localhost.localdomain 123

解釋:

每位系統管理員都肯定寫過很多類似這樣的命令:

cat randdata | awk {print $2} | sort | uniq -c | tee sortdata。

這個管道符 | 可以算是 Linux 世界最偉大的發明之一(另一個是「一切皆文件」)。

Logstash 就像管道符一樣!

你輸入(就像命令行的 cat )數據,然後處理過濾(就像 awk 或者 uniq 之類)數據,最後輸出(就像 tee )到其他地方。

當然實際上,Logstash 是用不同的線程來實現這些的

數據在線程之間以 事件 的形式流傳。不要叫行,因為 logstash 可以處理多行事件。

Logstash 會給事件添加一些額外信息。最重要的就是 @timestamp,用來標記事件的發生時間。因為這個欄位涉及到 Logstash 的內部流轉,所以必須是一個 joda 對象,如果你嘗試自己給一個字元串欄位重命名為 @timestamp 的話,Logstash 會直接報錯。所以,請使用 filters/date 插件 來管理這個特殊欄位

此外,大多數時候,還可以見到另外幾個:

  • host 標記事件發生在哪裡。
  • type 標記事件的唯一類型。
  • tags 標記事件的某方面屬性。這是一個數組,一個事件可以有多個標籤。

-e參數允許Logstash直接通過命令行接受設置。這點尤其快速的幫助我們反覆的測試配置是否正確而不用寫配置文件

以上例子我們在運行logstash中,定義了一個叫」stdin」的input還有一個」stdout」的output,無論我們輸入什麼字元,Logstash都會按照某種格式來返回我們輸入的字元

2.命令行輸入內容然後讓logstash以某種格式輸出

運行命令:

./logstash -e input { stdin { } } output { stdout { codec => rubydebug } }

logstach輸出:

Settings: Default pipeline workers: 2

Pipeline main started

表示啟動成功

在控制台輸入123,然後logstash輸出如下:

123

{

"message" => "123",

"@version" => "1",

"@timestamp" => "2017-11-02T02:51:55.681Z",

"host" => "localhost.localdomain"

}

命令解釋:

codec 指定了數據輸出類型是rubydebug類型,還可以是json類型等等

3.命令行輸入內容然後讓logstash使用Elasticsearch存儲

-e參數在命令行中指定配置是很常用的方式,不過如果需要配置更多設置則需要很長的內容。這種情況,我們首先創建一個簡單的配置文件

建一個文件名是」logstash.conf」的配置文件並且保存在和Logstash相同的目錄中,配置一個已經按照好的es的ip

input { stdin { } }

output {

elasticsearch { host => "xxx.xxx.xxx.xx" }

stdout { codec => rubydebug }

}

到bin目錄運行logstash -f參數用於指定配置文件:

.logstash -f logstash.conf

logstach輸出:

Settings: Default pipeline workers: 2

Pipeline main started

表示啟動成功

輸入123,logstach輸出如下

123

{

"message" => "123",

"@version" => "1",

"@timestamp" => "2017-11-02T03:02:48.516Z",

"host" => "localhost.localdomain"

}

然後到es的head插件中查看,es中已經存在一條數據了:

你將發現Logstash可以足夠靈巧的在Elasticsearch上建立索引… 每天會按照默認格式是logstash-YYYY.MM.DD來建立索引。在午夜(GMT),Logstash自動按照時間戳更新索引。我們可以根據追溯多長時間的數據作為依據來制定保持多少數據,當然你也可以把比較老的數據遷移到其他的地方(重新索引)來方便查詢,

4.使用過濾器解析日誌存到es中

在bin目錄下創建一個配置文件 logstash-filter.conf

input { stdin { } }

filter {

grok {

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

}

date {

match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]

}

}

output {

elasticsearch { hosts => "192.168.102.13" }

stdout { codec => rubydebug }

}

運行:

./logstash -f logstash-filter.conf

logstach輸出:

Settings: Default pipeline workers: 2

Pipeline main started

表示啟動成功

輸入:

127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.php HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0"

logstash輸出:

{

"message" => "127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.php HTTP/1.1" 200 3891 "cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0" ",

"@version" => "1",

"@timestamp" => "2013-12-11T08:01:45.000Z",

"host" => "localhost.localdomain",

"clientip" => "127.0.0.1",

"ident" => "-",

"auth" => "-",

"timestamp" => "11/Dec/2013:00:01:45 -0800",

"verb" => "GET",

"request" => "/xampp/status.php",

"httpversion" => "1.1",

"response" => "200",

"bytes" => "3891",

"referrer" => ""cadenza/xampp/navi.php"",

"agent" => ""Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0""

}

然後到es的head插件中查看,es中已經存在一條數據了:

Logstash(使用了grok過濾器)能夠將一行的日誌數據(Apache的」combined log」格式)分割設置為不同的數據欄位。這一點對於日後解析和查詢我們自己的日誌數據非常有用。比如:HTTP的返回狀態碼,IP地址相關等等,非常的容易。很少有匹配規則沒有被grok包含,所以如果你正嘗試的解析一些常見的日誌格式,或許已經有人為了做了這樣的工作。

另外一個過濾器是date filter。這個過濾器來負責解析出來日誌中的時間戳並將值賦給timestamp欄位

5.從文件獲取日誌保存到es中

在bin目錄下創建一個配置文件 logstash-apache.conf

input {

file {

path => "/opt/logstash-2.3.4/logs/*"

start_position => beginning

}

}

filter {

grok {

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

}

date {

match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]

}

}

output {

elasticsearch {

hosts => "192.168.102.13"

}

stdout { codec => rubydebug }

}

運行:

./logstash -f logstash-apache.conf

logstach輸出:

Settings: Default pipeline workers: 2

Pipeline main started

表示啟動成功

去es插件中可以看到apache的日誌數據已經導入到ES中了

此外,你也許還會發現Logstash不會重複處理文件中已經處理過得events。因為Logstash已經記錄了文件處理的位置,這樣就只處理文件中新加入的行數

logstash詳解

引言

從 Logstash 的名字就能看出,它主要負責跟日誌相關的各類操作,在此之前,我們先來看看日誌管理的三個境界吧

  • 境界一

    『昨夜西風凋碧樹。獨上高樓,望盡天涯路』,在各台伺服器上用傳統的 linux 工具(如 cat, tail, sed, awk, grep 等)對日誌進行簡單的分析和處理,基本上可以認為是命令級別的操作,成本很低,速度很快,但難以復用,也只能完成基本的操作。
  • 境界二

    『衣帶漸寬終不悔,為伊消得人憔悴』,伺服器多了之後,分散管理的成本變得越來越多,所以會利用 rsyslog 這樣的工具,把各台機器上的日誌匯總到某一台指定的伺服器上,進行集中化管理。這樣帶來的問題是日誌量劇增,小作坊式的管理基本難以滿足需求。
  • 境界三

    『眾里尋他千百度,驀然回首,那人卻在燈火闌珊處』,隨著日誌量的增大,我們從日誌中獲取去所需信息,並找到各類關聯事件的難度會逐漸加大,這個時候,就是 Logstash 登場的時候了

Logstash 的主要優勢,一個是在支持各類插件的前提下提供統一的管道進行日誌處理(就是 input-filter-output 這一套),二個是靈活且性能不錯

logstash裡面最基本的概念(先不管codec)

logstash收集日誌基本流程: input–>filter–>output

input:從哪裡收集日誌

filter:對日誌進行過濾

output:輸出哪裡

架構

Logstash 是由 JRuby 編寫的,使用基於消息的簡單架構,在 JVM 上運行。理念非常簡單,如果說 MapReduce 框架分為 Mapper 和 Reducer 兩大模塊,那麼 Logstash 有仨

  • Collect: 數據輸入。對應 input
  • Enrich: 數據處理。對應 filter
  • Transport: 數據輸出。對應 output

雖然模塊僅僅比 MapReduce 框架多了一個,但是無三不成幾,通過不同的拓撲結構,可以完成各類數據處理應用。不過這裡我們主要還是以日誌匯總處理系統的思路來進行介紹,一個典型的架構為:

配置語法

Logstash 設計了自己的 DSL —— 有點像 Puppet 的 DSL,或許因為都是用 Ruby 語言寫的吧 —— 包括有區域,注釋,數據類型(布爾值,字元串,數值,數組,哈希),條件判斷,欄位引用等。

區段(section)

Logstash 用 {} 來定義區域。區域內可以包括插件區域定義,你可以在一個區域內定義多個插件。插件區域內則可以定義鍵值對設置。示例如下:

input {

stdin {}

syslog {}

}

數據類型

  • bool

debug => true

  • string

host => 「hostname」

  • number

port => 514

  • array

match => [「datetime」, 「UNIX」, 「ISO8601」]

  • hash

options => {

key1 => 「value1」,

key2 => 「value2」

}

欄位引用(field reference)

如果你想在 Logstash 配置中使用欄位的值,只需要把欄位的名字寫在中括弧 [] 里就行了,這就叫欄位引用。

對於 嵌套欄位(也就是多維哈希表,或者叫哈希的哈希),每層的欄位名都寫在 [] 里就可以了。比如,你可以從 geoip 里這樣獲取 longitude 值(是的,這是個笨辦法,實際上有單獨的欄位專門存這個數據的):

[geoip][location][0]

條件判斷(condition)

Logstash從 1.3.0 版開始支持條件判斷和表達式

表達式支持下面這些操作符:

  • ==(等於), !=(不等於), <(小於), >(大於), <=(小於等於), >=(大於等於)
  • =~(匹配正則), !~(不匹配正則)
  • n(包含), not in(不包含)
  • and(與), or(或), nand(非與), xor(非或)
  • ()(複合表達式), !()(對複合表達式結果取反)

通常來說,你都會在表達式里用到欄位引用。為了盡量展示全面各種表達式,下面虛擬一個示例:

if "_grokparsefailure" not in [tags] {

} else if [status] !~ /^2dd/ or ( [url] == "/noc.gif" nand [geoip][city] != "beijing" ) {

} else {

}

命令行參數

Logstash 提供了一個 shell 腳本叫 logstash 方便快速運行。它支持以下參數:

  • -e

執行。我們在 「Hello World」 的時候已經用過這個參數了。事實上你可以不寫任何具體配置,直接運行

  • –config 或 -f

文件。真實運用中,我們會寫很長的配置,甚至可能超過 shell 所能支持的 1024 個字元長度。所以我們必把配置固化到文件里,然後通過 bin/logstash -f agent.conf 這樣的形式來運行

此外,logstash 還提供一個方便我們規劃和書寫配置的小功能。你可以直接用 bin/logstash -f /etc/logstash.d/ 來運行。logstash 會自動讀取 /etc/logstash.d/ 目錄下所有 *.conf 的文本文件,然後在自己內存里拼接成一個完整的大配置文件,再去執行。

  • –configtest 或 -t

測試。用來測試 Logstash 讀取到的配置文件語法是否能正常解析

  • –log 或 -l

日誌。Logstash 默認輸出日誌到標準錯誤。生產環境下你可以通過 bin/logstash -l logs/logstash.log 命令來統一存儲日誌

  • –pipeline-workers 或 -w

運行 filter 和 output 的 pipeline 線程數量。默認是 CPU 核數

  • –pipeline-batch-size 或 -b

每個 Logstash pipeline 線程,在執行具體的 filter 和 output 函數之前,最多能累積的日誌條數。默認是 125 條。越大性能越好,同樣也會消耗越多的 JVM 內存

  • –pipeline-batch-delay 或 -u

每個 Logstash pipeline 線程,在打包批量日誌的時候,最多等待幾毫秒。默認是 5 ms

  • –pluginpath 或 -P

可以寫自己的插件,然後用 bin/logstash –pluginpath /path/to/own/plugins 載入它們

  • –verbose

輸出一定的調試日誌

  • –debug

輸出更多的調試日誌

配置文件

從 Logstash 5.0 開始,新增了 $LS_HOME/config/logstash.yml 文件,可以將所有的命令行參數都通過 YAML 文件方式設置。同時為了反映命令行配置參數的層級關係,參數也都改成用.而不是-了

pipeline:

workers: 24

batch:

size: 125

delay: 5

plugin的安裝

從 logstash 1.5.0 版本開始,logstash 將所有的插件都獨立拆分成 gem 包。這樣,每個插件都可以獨立更新,不用等待 logstash 自身做整體更新的時候才能使用了。

為了達到這個目標,logstash 配置了專門的 plugins 管理命令。

Usage:

bin/logstash-plugin [OPTIONS] SUBCOMMAND [ARG] ...

Parameters:

SUBCOMMAND subcommand

[ARG] ... subcommand arguments

Subcommands:

install Install a plugin

uninstall Uninstall a plugin

update Install a plugin

list List all installed plugins

Options:

-h, --help print help

運行方式

  1. 標準的 service 方式

採用 RPM、DEB 發行包安裝的讀者,推薦採用這種方式

  1. 最基礎的 nohup 方式

想要維持一個長期後台運行的 logstash,你需要同時在命令前面加 nohup,後面加 &。

  1. 更優雅的 SCREEN 方式(不詳細說了)
  2. 最推薦的 daemontools 方式(不詳細說了)

插件配置

下面只列出列表,詳細配置可查看官方文檔

輸入插件(Input)

  • 讀取文件(File)
  • 標準輸入(Stdin)
  • 讀取 Syslog 數據
  • 讀取網路數據(TCP)

編碼插件(Codec)

Codec 是 logstash 從 1.3.0 版開始新引入的概念

在此之前,logstash 只支持純文本形式輸入,然後以過濾器處理它。但現在,我們可以在輸入 期處理不同類型的數據,這全是因為有了 codec 設置

這裡需要糾正之前的一個概念。Logstash 不只是一個input | filter | output 的數據流,而是一個 input | decode | filter | encode | output 的數據流!

codec 就是用來 decode、encode 事件的

codec 的引入,使得 logstash 可以更好更方便的與其他有自定義數據格式的運維產品共存,比如 graphite、fluent、netflow、collectd,以及使用 msgpack、json、edn 等通用數據格式的其他產品等

  • json
  • 合併多行數據(Multiline)
  • collectd
  • netflow

過濾器插件(Filter)

名為過濾器,其實提供的不單單是過濾的功能。在本章我們就會重點介紹幾個插件,它們擴展了進入過濾器的原始數據,進行複雜的邏輯處理,甚至可以無中生有的添加新的 logstash 事件到後續的流程中去

  • date
  • grok
  • dissect
  • geoip
  • json
  • kv
  • metrices
  • mutate
  • ruby
  • split
  • elapsed

output配置

  • elasticsearch
  • email
  • exec
  • file
  • nagios
  • statsd
  • stdout
  • tcp
  • hdfs

(本文完)

參考自:

  • kibana.logstash.es/cont
  • blog.csdn.net/wp500/art
  • cnblogs.com/xing901022/
  • wdxtub.com/2016/07/24/l
  • wdxtub.com/2016/07/26/e
  • yincheng.site/logstash

推薦閱讀:

關於 logstash 使用的一些小技巧

TAG:Logstash | ELK |