前面的時(shí)候,我因?yàn)楹笈_(tái)粉絲的一些問(wèn)題虱饿,整理了一篇文章拥诡,將ELK三個(gè)技術(shù)進(jìn)行詳細(xì)的講解,從原理到實(shí)踐氮发,全面覆蓋渴肉,但是因?yàn)槠颍曳殖闪藘善M(jìn)行整理爽冕,上篇主講ES仇祭,文章鏈接在這里:熬夜不睡覺(jué)整理ELK技術(shù)文檔,從此擺脫靠百度的工作(附源碼)
今天是其他的個(gè)技術(shù):Logstash+Kibana颈畸,中間穿插著講解Kafka應(yīng)用
話不多說(shuō)乌奇,直接上正題
一、 Logstash數(shù)據(jù)采集工具安裝和使用
1. 簡(jiǎn)介
Logstash是一款輕量級(jí)的日志搜集處理框架眯娱,可以方便的把分散的礁苗、多樣化的日志搜集起來(lái),并進(jìn)行自定義的處理徙缴,然后傳輸?shù)街付ǖ奈恢檬曰铮热缒硞€(gè)服務(wù)器或者文件。
而在官網(wǎng),對(duì)于Logstash的介紹更是完整迁霎,我這里就展示一下官網(wǎng)的介紹
輸入:采集各種樣式、大小和來(lái)源的數(shù)據(jù)
過(guò)濾器:實(shí)時(shí)解析和轉(zhuǎn)換數(shù)據(jù)
輸出:選擇你的存儲(chǔ)携御,導(dǎo)出你的數(shù)據(jù)
而在官網(wǎng)的介紹中,最讓我興奮的就是可擴(kuò)展性啄刹,Logstash 采用可插拔框架涮坐,擁有 200 多個(gè)插件。您可以將不同的輸入選擇誓军、過(guò)濾器和輸出選擇混合搭配袱讹、精心安排,讓它們?cè)诠艿乐泻椭C地運(yùn)行昵时。這也就意味著可以用自己的方式創(chuàng)建和配置管道捷雕,就跟樂(lè)高積木一樣,我自己感覺(jué)太爽了
好了壹甥,理論的東西過(guò)一遍就好
ps:不過(guò)這也體現(xiàn)出官網(wǎng)在學(xué)習(xí)的過(guò)程中的重要性救巷,雖然都是英文的,但是句柠,現(xiàn)在可以翻譯的軟件的太多了浦译,這不是問(wèn)題
2. 安裝
所有的技術(shù),不自己實(shí)際操作一下是不可以的溯职,安裝上自己動(dòng)手實(shí)踐一下精盅,毛爺爺都說(shuō):實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),不得不夸獎(jiǎng)一下Logstash的工程師谜酒,真的太人性化了叹俏,下載后直接解壓,就可以了甚带。
而且提供了很多的安裝方式供你選擇她肯,舒服
3. helloword使用
開(kāi)始我們今天的第一個(gè)實(shí)踐吧鹰贵,就像我們剛開(kāi)始學(xué)Java的時(shí)候晴氨,第一個(gè)命令就是helloworld,不知道各位還能不能手寫(xiě)出來(lái)呢碉输?來(lái)看一下logstash的第一個(gè)運(yùn)行時(shí)怎么處理的
通過(guò)命令行籽前,進(jìn)入到logstash/bin目錄,執(zhí)行下面的命令:
input {
kafka {
type => "accesslogs"
codec => "plain"
auto_offset_reset => "smallest"
group_id => "elas1"
topic_id => "accesslogs"
zk_connect => "172.16.0.11:2181,172.16.0.12:2181,172.16.0.13:2181"
}
kafka {
type => "gamelogs"
auto_offset_reset => "smallest"
codec => "plain"
group_id => "elas2"
topic_id => "gamelogs"
zk_connect => "172.16.0.11:2181,172.16.0.12:2181,172.16.0.13:2181"
}
}
filter {
if [type] == "accesslogs" {
json {
source => "message"
remove_field => [ "message" ]
target => "access"
}
}
if [type] == "gamelogs" {
mutate {
split => { "message" => " " }
add_field => {
"event_type" => "%{message[3]}"
"current_map" => "%{message[4]}"
"current_X" => "%{message[5]}"
"current_y" => "%{message[6]}"
"user" => "%{message[7]}"
"item" => "%{message[8]}"
"item_id" => "%{message[9]}"
"current_time" => "%{message[12]}"
}
remove_field => [ "message" ]
}
}
}
output {
if [type] == "accesslogs" {
elasticsearch {
index => "accesslogs"
codec => "json"
hosts => ["172.16.0.14:9200", "172.16.0.15:9200", "172.16.0.16:9200"]
}
}
if [type] == "gamelogs" {
elasticsearch {
index => "gamelogs"
codec => plain {
charset => "UTF-16BE"
}
hosts => ["172.16.0.14:9200", "172.16.0.15:9200", "172.16.0.16:9200"]
}
}
}
可以看到提示下面信息(這個(gè)命令稍后介紹),輸入hello world!
可以看到logstash為我們自動(dòng)添加了幾個(gè)字段:
時(shí)間戳:@ timestamp
版本:@ version
輸入的類型:type
主機(jī)名:host肄梨。
4.1. 簡(jiǎn)單的工作原理
Logstash使用管道方式進(jìn)行日志的搜集處理和輸出。有點(diǎn)類似*NIX系統(tǒng)的管道命令 xxx | ccc | ddd挠锥,xxx執(zhí)行完了會(huì)執(zhí)行ccc众羡,然后執(zhí)行ddd。
在logstash中蓖租,包括了三個(gè)階段:
輸入input --> 處理filter(不是必須的) --> 輸出output
每個(gè)階段都有很多的插件配合工作,比如file蓖宦、elasticsearch齐婴、redis等等。
每個(gè)階段也可以指定多種方式稠茂,比如輸出既可以輸出到elasticsearch中柠偶,也可以指定到stdout在控制臺(tái)打印。
由于這種插件式的組織方式睬关,使得logstash變得易于擴(kuò)展和定制诱担。
4.2. 命令行中常用的命令
-f:通過(guò)這個(gè)命令可以指定Logstash的配置文件,根據(jù)配置文件配置logstash
-e:后面跟著字符串该肴,該字符串可以被當(dāng)做logstash的配置(如果是“” 則默認(rèn)使用stdin作為輸入,stdout作為輸出)
-l:日志輸出的地址(默認(rèn)就是stdout直接在控制臺(tái)中輸出)
-t:測(cè)試配置文件是否正確匀哄,然后退出。
4.3. 配置文件說(shuō)明
前面介紹過(guò)logstash基本上由三部分組成涎嚼,input、output以及用戶需要才添加的filter挑秉,因此標(biāo)準(zhǔn)的配置文件格式如下:
input {...}
filter {...}
output {...}
在每個(gè)部分中,也可以指定多個(gè)訪問(wèn)方式犀概,例如我想要指定兩個(gè)日志來(lái)源文件立哑,則可以這樣寫(xiě):
input {
file { path =>"/var/log/messages" type =>"syslog"}
file { path =>"/var/log/apache/access.log" type =>"apache"}
}
類似的,如果在filter中添加了多種處理規(guī)則姻灶,則按照它的順序一一處理铛绰,但是有一些插件并不是線程安全的。
比如在filter中指定了兩個(gè)一樣的的插件产喉,這兩個(gè)任務(wù)并不能保證準(zhǔn)確的按順序執(zhí)行捂掰,因此官方也推薦避免在filter中重復(fù)使用插件敢会。
說(shuō)完這些,簡(jiǎn)單的創(chuàng)建一個(gè)配置文件的小例子看看:
input {
file {
#指定監(jiān)聽(tīng)的文件路徑这嚣,注意必須是絕對(duì)路徑
path => "E:/software/logstash-1.5.4/logstash-1.5.4/data/test.log"
start_position => beginning
}
}
filter {
}
output {
stdout {}
}
日志大致如下:注意最后有一個(gè)空行鸥昏。
1 hello,this is first line in test.log!
2 hello,my name is xingoo!
3 goodbye.this is last line in test.log!
4
執(zhí)行命令得到如下信息:
5. 最常用的input插件——file姐帚。
這個(gè)插件可以從指定的目錄或者文件讀取內(nèi)容吏垮,輸入到管道處理,也算是logstash的核心插件了罐旗,大多數(shù)的使用場(chǎng)景都會(huì)用到這個(gè)插件惫皱,因此這里詳細(xì)講述下各個(gè)參數(shù)的含義與使用。
5.1. 最小化的配置文件
在Logstash中可以在 input{} 里面添加file配置尤莺,默認(rèn)的最小化配置如下:
input {
file {
path => "E:/software/logstash-1.5.4/logstash-1.5.4/data/*"
}
}
filter {
}
output {
stdout {}
}
當(dāng)然也可以監(jiān)聽(tīng)多個(gè)目標(biāo)文件:
input {
file {
path => ["E:/software/logstash-1.5.4/logstash-1.5.4/data/*","F:/test.txt"]
}
}
filter {
}
output {
stdout {}
}
5.2. 其他的配置
另外,處理path這個(gè)必須的項(xiàng)外生棍,file還提供了很多其他的屬性:
input {
file {
#監(jiān)聽(tīng)文件的路徑
path => ["E:/software/logstash-1.5.4/logstash-1.5.4/data/*","F:/test.txt"]
#排除不想監(jiān)聽(tīng)的文件
exclude => "1.log"
#添加自定義的字段
add_field => {"test"=>"test"}
#增加標(biāo)簽
tags => "tag1"
#設(shè)置新事件的標(biāo)志
delimiter => "\n"
#設(shè)置多長(zhǎng)時(shí)間掃描目錄颤霎,發(fā)現(xiàn)新文件
discover_interval => 15
#設(shè)置多長(zhǎng)時(shí)間檢測(cè)文件是否修改
stat_interval => 1
#監(jiān)聽(tīng)文件的起始位置,默認(rèn)是end
start_position => beginning
#監(jiān)聽(tīng)文件讀取信息記錄的位置
sincedb_path => "E:/software/logstash-1.5.4/logstash-1.5.4/test.txt"
#設(shè)置多長(zhǎng)時(shí)間會(huì)寫(xiě)入讀取的位置信息
sincedb_write_interval => 15
}
}
filter {
}
output {
stdout {}
}
其中值得注意的是:
1 path
是必須的選項(xiàng)涂滴,每一個(gè)file配置友酱,都至少有一個(gè)path
2 exclude
是不想監(jiān)聽(tīng)的文件,logstash會(huì)自動(dòng)忽略該文件的監(jiān)聽(tīng)柔纵。配置的規(guī)則與path類似缔杉,支持字符串或者數(shù)組,但是要求必須是絕對(duì)路徑搁料。
3 start_position
是監(jiān)聽(tīng)的位置或详,默認(rèn)是end,即一個(gè)文件如果沒(méi)有記錄它的讀取信息郭计,則從文件的末尾開(kāi)始讀取霸琴,也就是說(shuō),僅僅讀取新添加的內(nèi)容昭伸。對(duì)于一些更新的日志類型的監(jiān)聽(tīng)梧乘,通常直接使用end就可以了;相反庐杨,beginning就會(huì)從一個(gè)文件的頭開(kāi)始讀取选调。但是如果記錄過(guò)文件的讀取信息,這個(gè)配置也就失去作用了灵份。
4 sincedb_path
這個(gè)選項(xiàng)配置了默認(rèn)的讀取文件信息記錄在哪個(gè)文件中仁堪,默認(rèn)是按照文件的inode等信息自動(dòng)生成。其中記錄了inode各吨、主設(shè)備號(hào)枝笨、次設(shè)備號(hào)以及讀取的位置袁铐。因此,如果一個(gè)文件僅僅是重命名横浑,那么它的inode以及其他信息就不會(huì)改變剔桨,因此也不會(huì)重新讀取文件的任何信息。類似的徙融,如果復(fù)制了一個(gè)文件洒缀,就相當(dāng)于創(chuàng)建了一個(gè)新的inode,如果監(jiān)聽(tīng)的是一個(gè)目錄欺冀,就會(huì)讀取該文件的所有信息树绩。
5 其他的關(guān)于掃描和檢測(cè)的時(shí)間,按照默認(rèn)的來(lái)就好了隐轩,如果頻繁創(chuàng)建新的文件饺饭,想要快速監(jiān)聽(tīng),那么可以考慮縮短檢測(cè)的時(shí)間职车。
//6 add_field
#這個(gè)技術(shù)感覺(jué)挺六的瘫俊,但是其實(shí)就是增加一個(gè)字段,例如:
file {
add_field => {"test"=>"test"}
path => "D:/tools/logstash/path/to/groksample.log"
start_position => beginning
}
6. Kafka與Logstash的數(shù)據(jù)采集對(duì)接
基于Logstash跑通Kafka還是需要注意很多東西悴灵,最重要的就是理解Kafka的原理扛芽。
6.1. Logstash工作原理
由于Kafka采用解耦的設(shè)計(jì)思想,并非原始的發(fā)布訂閱积瞒,生產(chǎn)者負(fù)責(zé)產(chǎn)生消息川尖,直接推送給消費(fèi)者。而是在中間加入持久化層——broker,生產(chǎn)者把數(shù)據(jù)存放在broker中茫孔,消費(fèi)者從broker中取數(shù)據(jù)叮喳。這樣就帶來(lái)了幾個(gè)好處:
1 生產(chǎn)者的負(fù)載與消費(fèi)者的負(fù)載解耦
2 消費(fèi)者按照自己的能力fetch數(shù)據(jù)
3 消費(fèi)者可以自定義消費(fèi)的數(shù)量
另外,由于broker采用了主題topic-->分區(qū)的思想银酬,使得某個(gè)分區(qū)內(nèi)部的順序可以保證有序性嘲更,但是分區(qū)間的數(shù)據(jù)不保證有序性。這樣揩瞪,消費(fèi)者可以以分區(qū)為單位赋朦,自定義讀取的位置——offset。
Kafka采用zookeeper作為管理李破,記錄了producer到broker的信息宠哄,以及consumer與broker中partition的對(duì)應(yīng)關(guān)系。因此嗤攻,生產(chǎn)者可以直接把數(shù)據(jù)傳遞給broker毛嫉,broker通過(guò)zookeeper進(jìn)行l(wèi)eader-->followers的選舉管理;消費(fèi)者通過(guò)zookeeper保存讀取的位置offset以及讀取的topic的partition分區(qū)信息妇菱。
由于上面的架構(gòu)設(shè)計(jì)暴区,使得生產(chǎn)者與broker相連;消費(fèi)者與zookeeper相連辛臊。有了這樣的對(duì)應(yīng)關(guān)系仙粱,就容易部署logstash-->kafka-->logstash的方案了。
接下來(lái)彻舰,按照下面的步驟就可以實(shí)現(xiàn)logstash與kafka的對(duì)接了伐割。
6.2. 啟動(dòng)kafka
##啟動(dòng)zookeeper:
$zookeeper/bin/zkServer.sh start
##啟動(dòng)kafka:
$kafka/bin/kafka-server-start.sh $kafka/config/server.properties &
6.3. 創(chuàng)建主題
#創(chuàng)建主題:
$kafka/bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --create --topic hello --replication-factor 1 --partitions 1
#查看主題:
$kafka/bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --describe
6.4. 測(cè)試環(huán)境
#執(zhí)行生產(chǎn)者腳本:
$kafka/bin/kafka-console-producer.sh --broker-list 10.0.67.101:9092 --topic hello
#執(zhí)行消費(fèi)者腳本刃唤,查看是否寫(xiě)入:
$kafka/bin/kafka-console-consumer.sh --zookeeper 127.0.0.1:2181 --from-beginning --topic hello
6.5. 向kafka中輸出數(shù)據(jù)
input{
stdin{}
}
output{
kafka{
topic_id => "hello"
bootstrap_servers => "192.168.0.4:9092,172.16.0.12:9092"
# kafka的地址
batch_size => 5
codec => plain {
format => "%{message}"
charset => "UTF-8"
}
}
stdout{
codec => rubydebug
}
}
6.6. 從kafka中讀取數(shù)據(jù)
logstash配置文件:
input{
kafka {
codec => "plain"
group_id => "logstash1"
auto_offset_reset => "smallest"
reset_beginning => true
topic_id => "hello"
zk_connect => "192.168.0.5:2181"
}
}
output{
stdout{
codec => rubydebug
}
}
7. Filter
7.1. 過(guò)濾插件grok組件
#日志
55.3.244.1 GET /index.html 15824 0.043
bin/logstash -e '
input { stdin {} }
filter {
grok {
match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
}
output { stdout {codec => rubydebug} }'
7.2. 分割插件split
filter {
mutate {
split => { "message" => " " }
add_field => {
"event_type" => "%{message[3]}"
"current_map" => "%{message[4]}"
"current_X" => "%{message[5]}"
"current_y" => "%{message[6]}"
"user" => "%{message[7]}"
"item" => "%{message[8]}"
"item_id" => "%{message[9]}"
"current_time" => "%{message[12]}"
}
remove_field => [ "message" ]
}
}
四隔心、 Kibana報(bào)表工具的安裝和使用
1. 簡(jiǎn)介
Logstash 早期曾經(jīng)自帶了一個(gè)特別簡(jiǎn)單的 logstash-web 用來(lái)查看 ES 中的數(shù)據(jù)。其功能太過(guò)簡(jiǎn)單尚胞,于是產(chǎn)生了Kibana硬霍。不過(guò)是用PHP編寫(xiě),后來(lái)為了滿足更多的使用需求笼裳,懶人推動(dòng)科技的進(jìn)步嘛须尚,并且Logstash使用ruby進(jìn)行編寫(xiě),所以重新編寫(xiě)Kibana侍咱,直到現(xiàn)在,Kibana因?yàn)橹貥?gòu)密幔,導(dǎo)致3楔脯,4某些情況下不兼容,所以出現(xiàn)了一山容二虎的情況胯甩,具體怎么選擇昧廷,可以根據(jù)業(yè)務(wù)場(chǎng)景進(jìn)行實(shí)際分析
在Kibana眾多的優(yōu)秀特性中偎箫,我個(gè)人最喜歡的是這一個(gè)特性木柬,我起名叫包容性
因?yàn)樵诠倬W(wǎng)介紹中淹办,Kibana可以非常方便地把來(lái)自Logstash眉枕、ES-Hadoop、Beats或第三方技術(shù)的數(shù)據(jù)整合到Elasticsearch怜森,支持的第三方技術(shù)包括Apache Flume速挑、Fluentd等。這也就表明我在日常的開(kāi)發(fā)工作中副硅,對(duì)于技術(shù)選型和操作的時(shí)候姥宝,我可以有更多的選擇,在開(kāi)發(fā)時(shí)也能找到相應(yīng)的開(kāi)發(fā)實(shí)例恐疲,節(jié)省了大量的開(kāi)發(fā)時(shí)間
ps:有一次體現(xiàn)了官網(wǎng)的重要性腊满,真的套么,有時(shí)候官網(wǎng)可以幫你解決大多數(shù)的問(wèn)題,有時(shí)間可以去看一下官網(wǎng)啊碳蛋,好了胚泌,話不多說(shuō),看正題
2. 安裝
下載安裝包后解壓
編輯文件config/kibana.yml 疮蹦,配置屬性:
[root@H32 ~]# cd kibana/config/
[root@H32 config]# vim kibana.yml
//添加:
server.host: "192.168.80.32"
elasticsearch.url: "http://172.16.0.14:9200"
先啟動(dòng)ES诸迟,然后再啟動(dòng)
cd /usr/local/kibana530bin/kibana
注意:
1、kibana必須是在root下運(yùn)行愕乎,否則會(huì)報(bào)錯(cuò)阵苇,啟動(dòng)失敗
2、下載解壓安裝包感论,一定要裝與ES相同的版本
3. 導(dǎo)入數(shù)據(jù)
我們將使用莎士比亞全集作為我們的示例數(shù)據(jù)绅项。要更好的使用 Kibana,你需要為自己的新索引應(yīng)用一個(gè)映射集(mapping)比肄。我們用下面這個(gè)映射集創(chuàng)建"莎士比亞全集"索引快耿。實(shí)際數(shù)據(jù)的字段比這要多,但是我們只需要指定下面這些字段的映射就可以了芳绩。注意到我們?cè)O(shè)置了對(duì) speaker 和 play_name 不分析掀亥。原因會(huì)在稍后講明挪略。
在終端運(yùn)行下面命令:
curl -XPUT http://localhost:9200/shakespeare -d '
{
"mappings" : {
"_default_" : {
"properties" : {
"speaker" : {"type": "string", "index" : "not_analyzed" },
"play_name" : {"type": "string", "index" : "not_analyzed" },
"line_id" : { "type" : "integer" },
"speech_number" : { "type" : "integer" }
}
}
}
}
我們這就創(chuàng)建好了索引∪切現(xiàn)在需要做的時(shí)導(dǎo)入數(shù)據(jù)。莎士比亞全集的內(nèi)容我們已經(jīng)整理成了 elasticsearch 批量 導(dǎo)入所需要的格式薯嗤,你可以通過(guò)<u style="box-sizing: border-box; text-decoration: none; margin: 0px; padding: 0px; border: 0px;">shakeseare.json</u>下載嘹害。
用如下命令導(dǎo)入數(shù)據(jù)到你本地的 elasticsearch 進(jìn)程中撮竿。
curl -XPUT localhost:9200/_bulk --data-binary @shakespeare.json
4. 訪問(wèn) Kibana 界面
打開(kāi)瀏覽器,訪問(wèn)已經(jīng)發(fā)布了 Kibana 的本地服務(wù)器笔呀。
如果你解壓路徑無(wú)誤(譯者注:使用 github 源碼的讀者記住發(fā)布目錄應(yīng)該是 kibana/src/ 里面),你已經(jīng)就可以看到上面這個(gè)可愛(ài)的歡迎頁(yè)面许师。點(diǎn)擊 Sample Dashboard 鏈接
好了,現(xiàn)在顯示的就是你的 sample dashboard微渠!如果你是用新的 elasticsearch 進(jìn)程開(kāi)始本教程的惨驶,你會(huì)看到一個(gè)百分比占比很重的餅圖。這里顯示的是你的索引中敛助,文檔類型的情況粗卜。如你所見(jiàn),99% 都是 lines纳击,只有少量的 acts 和scenes续扔。
在下面攻臀,你會(huì)看到一長(zhǎng)段 JSON 格式的莎士比亞詩(shī)文。
5. 第一次搜索
Kibana 允許使用者采用 Lucene Query String 語(yǔ)法搜索 Elasticsearch 中的數(shù)據(jù)纱昧。請(qǐng)求可以在頁(yè)面頂部的請(qǐng)求輸入框中書(shū)寫(xiě)刨啸。
在請(qǐng)求框中輸入如下內(nèi)容识脆。然后查看表格中的前幾行內(nèi)容设联。
friends, romans, countrymen
6. 配置另一個(gè)索引
目前 Kibana 指向的是 Elasticsearch 一個(gè)特殊的索引叫 _all灼捂。 _all 可以理解為全部索引的大集合离例。目前你只有一個(gè)索引, shakespeare悉稠,但未來(lái)你會(huì)有更多其他方面的索引宫蛆,你肯定不希望 Kibana 在你只想搜《麥克白》里心愛(ài)的句子的時(shí)候還要搜索全部?jī)?nèi)容。
配置索引的猛,點(diǎn)擊右上角的配置按鈕:
在這里,你可以設(shè)置你的索引為 shakespeare 卦尊,這樣 Kibana 就只會(huì)搜索 shakespeare 索引的內(nèi)容了叛拷。
這是因?yàn)?ES1.4 增強(qiáng)了權(quán)限管理胡诗。你需要在 ES 配置文件 elasticsearch.yml 中添加下列配置并重啟服務(wù)后才能正常訪問(wèn):
http.cors.enabled: true
http.cors.allow-origin: "*"
記住 kibana3 頁(yè)面也要刷新緩存才行。
此外淌友,如果你可以很明確自己 kibana 以外沒(méi)有其他 http 訪問(wèn),可以把 kibana 的網(wǎng)址寫(xiě)在http.cors.allow-origin 參數(shù)的值中骇陈。比如:
http.cors.allow-origin: "/https?:\/\/kbndomain/"
好了震庭,到這里就結(jié)束了,不知道有沒(méi)有收獲呀你雌,有收獲的朋友給我點(diǎn)個(gè)贊吧~