(二)ELK學習之LogStash

什麼是 Logstash

Logstash 是一個開源工具,它可以對你的日誌進行收集、分析、並將其存儲以後使用

怎麼用 Logstash

安裝配置

在安裝之前要有 Java1.8 環境,因此先要配置 Java 環境,這點不懂可自行百度。

首先安裝 Logstash,[Logstash下載地址][1]。因爲我是在 Windows 下安裝,因此下載的是 ZIP 版本 。下載完成後,直接解壓即可。

解壓完畢後,進入 bin 目錄,首先要寫響應的配置文件,先新建一個配置文件,pipeline.conf 配置文件主要包括三個部分,分別是 input、filter、output 分別定義了輸入來源,過濾規則,輸出到什麼地方。一個簡單地配置文件如下,從控制檯輸入,在輸出到控制檯,沒有過濾規則。

input { stdin { } } 
output { stdout {} }

然後執行命令 logstash agent -f pipeline.conf ,結果如下:

PS C:\ELK\logstash-2.1.0\bin> .\logstash agent -f .\pipeline.conf
io/console not supported; tty will not be manipulated
Settings: Default filter workers: 2
Logstash startup completed

表示運行成功,在命令行輸入 hello world ,顯示如下:

PS C:\ELK\logstash-2.1.0\bin> .\logstash agent -f .\pipeline.conf
io/console not supported; tty will not be manipulated
Settings: Default filter workers: 2
Logstash startup completed
hello world
2015-12-03T13:30:39.180Z liuyb hello world

配置語法

Logstash 設計了自己的 DSL ———— 包括有區域、註釋、數據類型(布爾值、字符串、數值、數組、哈希)、條件判斷、字段引用。

  • 區段(section)
    Logstash 用 {} 來定義區域,區域內可以包括插件區域定義,你可以在一個區域內定義多個插件,插件區域內則可以定義鍵值對設置。如下所示。
input{
    stdin{}
    syslog{}
}
  • 數據類型

    • bool

      debug=>true

    • String

      host=>”hostname”

    • number

      port=>514

    • array

      options=>{key1=>val1,key2=>val2}

  • 字段引用
    字段是 Logstash::Event 對象的屬性。我們之前提過事件就像一個哈希一樣,所以你可以想象字段就想一個鍵值對。
    如果你想在 Logstash 配置中使用字段的值,只需要把字段的名字寫在中括號 [] 裏就行了,這就叫做字段引用。
    對於嵌套字段(也就是多維哈希表,或者叫哈希的哈希),每層的字段名都寫在 [] 裏就可以了。

  • 條件判斷
    表達式支持以下這些操作符

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

插件介紹

在 “Hello World” 示例中,我麼已經見到並介紹了 Logstash 的運行流程和配置的基礎語法。從這裏開始我們就要逐一介紹 Logstash 流程中比較常用的一些插件,並在介紹中針對其主要適用的場景,推薦的配置,做一些說明。

配置示例中代碼並不能貼完整,請記住一個原則:Logstash 配置一定要有一個 input 和一個 output。

input

collectd

collectd 是一個守護進程,用來收集系統性能和提供各種存儲方式來存儲不同值的機制,他會在系統運行和存儲信息時週期性的統計系統相關信息。利用這些信息有助於查找當前系統性能瓶頸(如作爲性能分析 performance analysis)和預測系統未來的 load(如能力部署 capacity planning)等。

collectd 的配置

以下配置可以實現對服務器基本的 CPU、內存、網卡流量、磁盤IO以及磁盤空間佔用情況監控

Hostname "host.example.com"
LoadPlugin interface
LoadPlugin cpu
LoadPlugin memory
LoadPlugin network
LoadPlugin df
LoadPlugin disk
<Plugin interface>
    Interface "eth0"
    IgnoreSelected false
</Plugin>
<Plugin network>
    <Server "10.0.0.1" "25826"> ## logstash 的 IP 地址和 collectd 的數據接收端口號
    </Server>
</Plugin>

Logstash配置

以下配置實現通過 logstash 監聽 25826 端口,接受從 collectd 發送過來的各項檢測數據:

input {
 collectd {
    port => 25826 ## 端口號與發送端對應
    type => collectd
}

推薦配置

udp {
    port => 25826
    buffer_size => 1452
    workers => 3          # Default is 2
    queue_size => 30000   # Default is 2000
    codec => collectd { }
    type => "collectd"
}

運行結果

{
  "_index": "logstash-2014.12.11",
  "_type": "collectd",
  "_id": "dS6vVz4aRtK5xS86kwjZnw",
  "_score": null,
  "_source": {
    "host": "host.example.com",
    "@timestamp": "2014-12-11T06:28:52.118Z",
    "plugin": "interface",
    "plugin_instance": "eth0",
    "collectd_type": "if_packets",
    "rx": 19147144,
    "tx": 3608629,
    "@version": "1",
    "type": "collectd",
    "tags": [
      "_grokparsefailure"
    ]
  },
  "sort": [
    1418279332118
  ]
}

file

Logstash 使用一個名叫 FileWatch 的 Ruby Gem 庫來監聽文件變化。這個庫支持 glob 展開文件路徑,而且會記錄一個叫 .sincedb 的數據庫文件來跟蹤被監聽的日誌文件的當前讀取位置。所以不要擔心 logstash 會漏過你的數據。
實例配置

input {
    file {
        path => ["/var/log/*.log", "/var/log/message"]
        type => "system"
        start_position => "beginning"
    }
}

解釋


  • discover_interval

logstash 每隔多久去檢查一次被監聽的 path 下是否有新文件,默認值是15秒

  • exclude

    不想被監聽的文件可以排除出去,這裏跟 path 一樣支持 glob 展開

  • close_older

    一個已經監聽中的文件,如果超過這個值的時間內沒有更新內容,就關閉監聽它的文件句柄。默認是 3600 秒,即一個小時

  • ignore_older

    在每次檢測文件列表的時候,如果一個文件的最後修改時間超過這個值,就忽略這個文件,默認是 86400 秒,即一天

  • since_path

    如果你不想使用默認的$HOME/.sincedb
    (Windows平臺上在C:\Windows\System32\config\systemprofile.sincedb),可以通過這個配置定義 sincedb 文件到其他位置

  • sincedb_write_interval

    logstash 每隔多久寫一次 sincedb 文件,默認是 15 秒

  • stat_interval

    logstash 每隔多久檢查一次被監聽文件狀態(是否有更新),默認是 1 秒。

  • start_position
    logstash 從什麼位置開始讀取文件數據,默認是結束位置,也就是說 logstash 進程會以類似 tail -F 的形式運行。如果你是要導入原有數據,把這個設定改成 “beginning”,logstash 進程就從頭開始讀取,有點類似 cat,但是讀到最後一行不會終止,而是繼續變成 tail -F。
  • stdin

    配置示例

    input {
        stdin {
            add_field => {"key" => "value"}
            codec => "plain"
            tags => ["add"]
            type => "std"
        }
    }

    運行結果

    用上面的 stdin 設置重新運行一次最開始的 hello world 示例。得到下面的輸出:

    {
           "message" => "hello world",
          "@version" => "1",
        "@timestamp" => "2014-08-08T06:48:47.789Z",
              "type" => "std",
              "tags" => [
            [0] "add"
        ],
               "key" => "value",
              "host" => "raochenlindeMacBook-Air.local"
    }

    解釋
    type 和 tags 是 logstash 事件中兩個特殊字段,通常來說我們會在輸入區段中通過 type 來標記事件類型。而 tags 則是在數據處理過程中,有具體的插件添加或者刪除的。

    常見用法如下:

    input {
        stdin {
            type => "web"
        }
    }
    filter {
        if [type] == "web" {
            grok {
                match => ["message", %{COMBINEDAPACHELOG}]
            }
        }
    }
    output {
        if "_grokparsefailure" in [tags] {
            nagios_nsca {
                nagios_status => "1"
            }
        } else {
            elasticsearch {
            }
        }
    }

    syslog

    tcp

    讀取網絡數據,未來你可能會使用 Redis 服務器或者其他的消息隊列系統來作爲 logstash broker 的角色。不過 Logstash 其實也有自己的 TCP/UDP 插件,在臨時任務的時候,也算能用,尤其是在測試環境中。

    配置示例

    input {
        tcp {
            port => 8888
            mode => "server"
            ssl_enable => false
        }
    }

    常見場景

    目前開來,LogStash::Inputs::TCP 最常見的用法就是配合 nc 命令導入舊數據。再啓動 Logstash 進程後,在另一個終端運行如下命令即可導入數據。

    nc 127.0.0.1 8888 < olddata

    codec(編碼插件)

    採用 Json 編碼

    示例配置

    input {
        file {
            path => "/var/log/nginx/access.log_json""
            codec => "json"
        }
    }

    合併多行數據(multiline)

    有些時候,應用程序調試日誌會包含非常豐富的內容,爲一個時間打印出很多行內容,這種日誌通常都很難通過命令行解析方式分析。
    而 logstash 正爲此準備好了 codec/multiline 插件

    示例配置

    input {
        stdin {
            codec => multiline {
                pattern => "^\["
                negate => true
                what => "previous"
            }
        }
    }

    運行結果
    運行 logstash 進程,然後在等待輸入的終端中輸入如下幾行數據:

    [Aug/08/08 14:54:03] hello world
    [Aug/08/09 14:54:04] hello logstash
        hello best practice
        hello raochenlin
    [Aug/08/10 14:54:05] the end

    你會發現 logstash 輸出下面的這樣的返回:

    {
        "@timestamp" => "2014-08-09T13:32:24.359Z",
           "message" => "[Aug/08/09 14:54:04] hello logstash\n\n    hello best practice\n\n    hello raochenlin\n",
          "@version" => "1",
              "tags" => [
            [0] "multiline"
        ],
              "host" => "raochenlindeMacBook-Air.local"
    }

    解釋
    其實這個插件的原理很簡單,就是把當前行的數據添加到前面一行後面,指導新的當前行匹配到 ^[ 正則爲止。

    netflow

    filter(過濾器插件)

    時間處理(Date)

    filter/date 插件

    grok

    geoip

    json

    kv

    metrics

    ruby

    split

    elapsed

    output

    持續更新中。。。

    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章