如何使用Logstash


一、什么是Logstash

Logstash是一個日志收集器,可以理解為一個管道,或者中間件。
功能是從定義的輸入源inputs讀取信息,經過filters過濾器處理,輸入到定義好的outputs輸出源。
輸入源可以是stdin、日志文件、數據庫等,輸出源可以是stdout、elesticsearch、HDFS等。

另外,Logstash不只是一個input | filter | output 的數據流,而是一個 input | decode | filter | encode | output 的數據流!有一個codec插件就是用來 decode、encode 事件的,可以解析我們經常用的json格式,非常的強大,接下來給大家演示一下Logstash的使用,一學就會。

二、如何安裝

最簡單方式是直接下載安裝,另外也可以通過docker安裝
我是直接下載的zip包,解壓后如下

三、快速使用

  • 直接啟動
./bin/logstash -e 'input { stdin { } } output { stdout {} }'

-e 代表可以從命令行讀取配置,input { stdin { } } output { stdout {} }'代表從標准stdin讀取,從stdout輸出,我們輸入

chenqionghe
no pain, no gain.

顯示如下,logstash把時間等一些信息打印出來了

logstash會給事件添加一些額外的信息,最重要的就是 @timestamp,用來標記事件的發生時間。此外,大多數時候還可以見到host、type、tags 等屬性

  • 使用配置啟動
    例如我們可以將上面的-e定義成一個chenqionghe.yml
input {
    stdin { }
}
output {
    stdout { }
}

運行

./bin/logstash -f chenqionghe.yml

更多配置查看 :configuration

四、input輸入插件

用來指定數據來源,可以是標准輸入、文件、TCP數據、Syslog、Redis等

  • 讀取文件
    例如,我要收集nginx的訪問文件和錯誤文件,可以這樣寫
input {
    file {
        path => ["/Users/chenqionghe/web/log/nginx-access.log","/Users/chenqionghe/web/log/nginx-error.log"]
        type => "nginx"
    }
}
output {
  stdout { codec => rubydebug }
}

output指定了一個rubydebug,簡單的理解就是一個調試輸出的插件,后面會對output進行說明
結果運行,可以看到收集到了nignx日志

常用配置項

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

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

* sincedb_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。
  • 生成測試數據
    例如可以使用generator來生成測試輸入數據,下面的例子相當於循環了100次
input {
    generator {
        count => 100
        message => '{"name":"chenqionghe","hello":["light","weight","baby"]}'
        codec => json
    }
}
output {
  stdout {}
}

運行如下

  • 讀取TCP
    可以使用logstash監聽一個tcp端口,我們直接連接這個tcp端口發送數據就可以了
    配置如下,監聽本機的12345
input {
    tcp {
        host => "127.0.0.1"
        port => "12345"
    }
}
output {
    stdout{codec => rubydebug}
}

啟動后我們用nc命令連接發送一下數據

 nc 127.0.0.1 12345


可以看到,已經能接收數據,可以看到logstash的功能相當強大,更多input插件請查看:input-plugins

五、codec編碼插件

事實上,我們在上面已經用過 codec 了 ,rubydebug 就是一種 codec,雖然它一般只會用在 stdout 插件中,作為配置測試或者調試的工具。
codec 使得 logstash 可以更好更方便的與其他有自定義數據格式的運維產品共存,比如 graphite、fluent、netflow、collectd,以及使用 msgpack、json、edn 等通用數據格式的其他產品等。

  • JSON編碼
    直接輸入預定義好的 JSON 數據,以nginx的配置為例,添加如下配置,讓nginx輸出json
log_format json '{"@timestamp":"$time_iso8601",'
               '"@version":"1",'
               '"host":"$server_addr",'
               '"client":"$remote_addr",'
               '"size":$body_bytes_sent,'
               '"responsetime":$request_time,'
               '"domain":"$host",'
               '"url":"$uri",'
               '"status":"$status"}';
access_log /Users/chenqionghe/web/log/nginx-access.log json;

在logstash中配置

input {
    file {
        path => "/Users/chenqionghe/web/log/nginx-access.log"
        codec => "json"
    }
}
output {
  stdout { codec => rubydebug }
}

啟動請求如下

  • 合並多行數據
    multiline 插件可以收集多行數據,用於用於其他類似的堆棧式信息
    示例如下
input {
    stdin {
        codec => multiline {
            pattern => "^\["
            negate => true
            what => "previous"
        }
    }
}

輸入

[2020-03-18 14:54:03] hello chenqionghe
[2020-03-18 14:54:03]hello gym
    light weight baby
    let's do it !
[2020-03-18 14:54:03] finished

效果如下

另外,codec還可以編解碼protobuf、fluent、nmap等,可以參考:codec-plugins

六、filter過濾器插件

logstash 威力強大的最重要的就是因為有豐富的過濾器插件。

  • Grok 正則捕獲
    Grok 是 Logstash 最重要的插件,預定義了非常多的正則變量,使用時可以直接通過%引用,另外,還可以在 grok 自定義命名正則表達式,在之后(grok參數或者其他正則表達式里)引用它,示例
input {stdin{}}
filter {
    grok {
        match => {
            "message" => "\s+(?<request_time>\d+(?:\.\d+)?)\s+"
        }
    }
}
output {stdout{}}

啟動后輸入

hello 123.123 world

可以,看到配置到了我們自定義的變量request_time

  • 時間處理
    filters/date 插件可以用來轉換你的日志記錄中的時間字符串,變成 LogStash::Timestamp 對象,然后轉存到 @timestamp 字段里。支持ISO8601、UNIX、UNIX_MS、TAI64N、Joda-Time 等格式
    示例
input {stdin{}}
filter{
    date{
        match => ["message","yyyyMMdd"]
    }
}
output {stdout{}}

如下

  • 數據修改
    filters/mutate 提供了豐富的基礎類型數據處理能力,包括類型轉換,字符串處理和字段處理等。
    轉換類型,支持integer、float和string。
filter {
    mutate {
        convert => ["request_time", "float"]
    }
}
  • 字符串處理
    可以對字符串進行split、join、merge、strip、rename、replace等操作
input {stdin{}}
filter {
    mutate {
        split => ["message", "|"]
    }
    mutate {
        join => ["message", ","]
    }
}
output {stdout{}}

先用|分割成數組,再通過,合成字符串

  • 拆分事件
    split插件可以把一行數據,拆分成多個事件
input {stdin{}}
filter {
    split {
        field => "message"
        terminator => "#"
    }
}
output {stdout{}}

另外,還有JSON編解碼、USerAgent匹配歸類、Key-Value切分、自定義Ruby處理等插件,更多可以查看:filter-plugins

七、output輸出插件

  • 標准輸出
    和 inputs/stdin 插件一樣,outputs/stdout 插件是最基礎和簡單的輸出插件,如下
output {
    stdout {
        codec => rubydebug
    }
}

代表輸出到stdout,使用rubydebug格式化

  • 保存文件
input {stdin{}}
output {
    file {
        path => "/Users/chenqionghe/web/log/test.log"
    }
}

可以看到,已經寫入test.log文件

  • 輸出到ElasticSearch
output {
    elasticsearch {
        host => "127.0.0.1"
        protocol => "http"
        index => "logstash-%{type}-%{+YYYY.MM.dd}"
        index_type => "%{type}"
        workers => 5
        template_overwrite => true
    }
}

啟動后,請求nginx后日志如下

可以看到已經打印出來了,我們去使用kibana控制台查詢es,可以看到索引和數據都已經有了

另外,output還可以設置輸出到Redis、發送郵件、執行命令等,更多可以查看output-plugins

八、總結

簡單地說,logstash最主要的功能是從input獲取數據,通過filter處理,再輸出到指定的地方。
一般我們收集日志都是在后台運行,建議使用nohup、screen或者supervisor這樣的方式啟動。

是不是覺得logstash超簡單,意不意外,開不開心,yeah buddy! light weight baby!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM