也不知道是不是升級的原因,還是一年前沒有把搭建踩坑沒記錄下來,導致一年後的今天項目要使用 又要填坑一次
elk的搭建網上比較全而雜,官網https://www.elastic.co/guide/index.html清晰明瞭,會有部分小細節未。。安裝方式和配置就不多說,
1:filebeat 採取宿主機安裝,規避docker容器考慮到(filebeat)容器內讀取各實例掛載的log文件,會比較繁瑣(curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.1-linux-x86_64.tar.gz)參考:elastic官網底子好
2:Step 2: Configure Filebeat(https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-configuration.html)
按慣例:這裏我貼上自己 filebeat配置文件,elk7.6.1 以tag作標識->logstash->es
#filebeat.config:
# modules:
# path: ${path.config}/modules.d/*.yml
# reload.enabled: false
#filebeat.autodiscover:
# providers:
# - type: docker
# hints.enabled: true
#processors:
#- add_cloud_metadata: ~
#output.elasticsearch:
# hosts: ['172.18.141.169:9200']
#username: '${ELASTICSEARCH_USERNAME:}'
#password: '${ELASTICSEARCH_PASSWORD:}'
#setup.kibana:
# host: "172.18.141.169:5601"
filebeat.inputs:
- type: log
enabled: true
paths:
# 需要收集的日誌所在的位置,可使用通配符進行配置
- /alex/data/hnjk-web-rest-prod/logs/info.log # 監控的日誌
tags: ["rest-info"] # 用於實現多日誌收集
- type: log
enabled: true
paths:
- /alex/data/hnjk-web-rest-prod/logs/error.log
tags: ["rest-error"]
- type: log
enabled: true
paths:
- /alex/data/hnjk-cec-oas-prod/logs/info.log
tags: ["oas-info"]
- type: log
enabled: true
paths:
- /alex/data/hnjk-cec-oas-prod/logs/error.log
tags: ["oas-error"]
#日誌輸出配置(採用 logstash 收集日誌,5044爲logstash端口)
output.logstash:
enabled: true
hosts: ['172.18.141.169:5044']
2:elk用docker 跑的,爲了方便參考之前的文章https://blog.csdn.net/qq_32447321/article/details/86539610
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.
input {
beats {
port => 5044
}
}
filter {
# if "beats_input_codec_plain_applied" in [tags] {
mutate {
remove_tag => ["beats_input_codec_plain_applied"]
}
# }
# mutate {
# split => ["message", "|"]
# }
# split {
# field => "message"
# terminator => "|"
# }
grok {
# 篩選過濾
match => {
#logstash 時間轉換 eg:在日誌文件中原生日誌是這樣子的:2020-03-20 18:04:15.331 ISO8601形式重點是後面的”.782“,後面附加以毫秒爲單位的。那麼grok插件中可以這樣子定義匹配的規則(%{TIMESTAMP_ISO8601:dataTime})
"message" => "(?m)\s*%{TIMESTAMP_ISO8601:dataTime}\|(?<thread>[A-Za-z0-9/-]{4,40})\|(?<level>[A-Z]{4,5})\s\|(?<class>[A-Za-z0-9/.]{4,40})\|(?<msg>.*) "
# "message" => "(?<date>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{3})\|(?<thread>[A-Za-z0-9/-]{4,40})\|(?<level>[A-Z]{4,5})\s\|(?<class>[A-Za-z0-9/.]{4,40})\|(?<msg>.*)"
}
remove_field => ["message"]
}
}
output {
if "rest-info" in [tags] { # 通過判斷標籤名,爲不同的日誌配置不同的index
elasticsearch {
hosts => ["172.18.141.169:9200"]
index => "rest-info-%{+YYYY.MM.dd}" # 索引名不能大寫
template_overwrite => true
}
stdout { codec => rubydebug }
}
else if "rest-error" in [tags] {
elasticsearch {
hosts => ["172.18.141.169:9200"]
index => "rest-error-%{+YYYY.MM.dd}"
template_overwrite => true
}
stdout { codec => rubydebug }
}
else if "oas-info" in [tags] {
elasticsearch {
hosts => ["172.18.141.169:9200"]
index => "oas-info-%{+YYYY.MM.dd}"
template_overwrite => true
}
stdout { codec => rubydebug }
}
else if "oas-error" in [tags] {
elasticsearch {
hosts => ["172.18.141.169:9200"]
index => "oas-error-%{+YYYY.MM.dd}"
template_overwrite => true
}
stdout { codec => rubydebug }
}
else{
elasticsearch {
hosts => ["172.18.141.169:9200"]
index => "hnjk-other-%{+YYYY.MM.dd}"
template_overwrite => true
}
stdout { codec => rubydebug }
}
}
$ ./logstash -t -f /etc/logstash/confi.d/30-logstash.conf #上面文件if判斷了{}有點多,可以用-t來驗證一下配置文件而不啓動,結尾出現下面就是可以了
-
Configuration OK [2017-12-07T19:38:07,082][INFO ][logstash.runner ] Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash
-
#logstash 時間轉換 eg:在日誌文件中原生日誌是這樣子的:2020-03-20 18:04:15.331 ISO8601形式重點是後面的”.782“,後面附加以毫秒爲單位的。那麼grok插件中可以這樣子定義匹配的規則(%{TIMESTAMP_ISO8601:dataTime})。
參考:https://github.com/elastic/elasticsearch/tree/master/libs/grok/src/main/resources/patterns
-
$ ./logstash -t -f /etc/logstash/confi.d/logstash-sample.conf #指定配置文件前臺啓動,我們先看看輸出。
使用到工具 :
Grok位於正則表達式說明: 參考https://blog.csdn.net/qq_41262248/article/details/79977925
校驗grok地址:http://grok.51vagaa.com/
2020-03-20 18:04:15.331|http-nio-8080-exec-3|WARN |c.e.h.i.StopWatchHandlerInterceptor|/api/bigScreen/day/infaultTop20 consume 785 millis
(?<date>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d{3})\|(?<thread>[A-Za-z0-9/-]{4,40})\|(?<level>[A-Z]{4,5})\s\|(?<class>[A-Za-z0-9/.]{4,40})\|(?<msg>.*)
elk運行遇到問題:
step 1 ------#filebeat啓動 lumberjack protocol error : 鏈接:https://www.jianshu.com/p/5df9db5cda8f
/etc/logstash/conf.d/02-beats-input.conf修改成如下圖所示:將以下三行刪除掉。這三行的意思是是否使用證書,本例是不使用證書的,如果你需要使用證書,將logstash.crt拷貝到客戶端,然後在filebeat.yml裏面添加路徑即可
ssl => true
ssl_certificate => "/pki/tls/certs/logstash.crt"
ssl_key => "/pki/tls/private/logstash.key"
注意:sebp/elk docker是自建立了一個證書logstash.crt,默認使用*通配配符,如果你使用證書,filebeat.yml使用的服務器地址必須使用域名,不能使用IP地址,否則會報錯
這裏如果不去掉這三行配置的話,在後面啓動filebeat時,會提示如下錯誤:
2018-09-12T10:01:29.770+0800 ERROR logstash/async.go:252 Failed to publish events caused by: lumberjack protocol error
2018-09-12T10:01:29.775+0800 ERROR logstash/async.go:252 Failed to publish events caused by: client is not connected
2018-09-12T10:01:30.775+0800 ERROR pipeline/output.go:109 Failed to publi
step 2---------
在kinana裏面僅有一個filebeat-*的索引,tag有(rest-info/rest-error/oas-info/oas-err)不過每條記錄都多出了一個beats_input_codec_plain_applied(es默認的);百度下發現是logstash -> es默認的, 怎麼辦?那就最容易想到的刪了唄
# if "beats_input_codec_plain_applied" in [tags] {
mutate {
remove_tag => ["beats_input_codec_plain_applied"]
}
# }
這裏存在一個疑問:明明我已經自定義了4個匹配規則logstash 的output 即使沒有匹配上也會到hnjk-else索引的;爲什麼還是會用beats_input_codec_plain_applied;不行還是有問題沒解決:
沒有絲路那就看啓動elk的日誌吧,elk封裝模塊(es,logstash,kinaba),當然也罷日誌封裝了;docker雖然方便 了但是這裏就體現了不方便;想起來ab在央視採訪是說到“上帝給了我這個容顏,一定會讓我得到些什麼,又會失去些什麼”shit happens..
雖然logstash在output裏面進行自定義index和filter 但是kibana裏面依然沒有自動加載到es的索引(rest-info-*/rest-error-*/oas-info-*/oas-err-*)還要繼續找原因... 後續根據docker啓動elk的日誌發現 logstash 加載的環境在/etc/logstash/confi.d/
02-beats-input.conf 10-syslog.conf 11-nginx.conf 30-output.conf 30-output.conf-bk(源)
看到這個output就明白七七八八了,緣來logstash配置默認加載的文件在這裏藏着阿,我自以爲定義的logstash-sample.conf(/opt/logstash/conf/logstash-sample.conf)都是假象; 改之,果然ok了
修改完後,改有的都有了,不再僅僅一個filebeat-*索引了(30-output-conf-bk 也印證了之前 就filebeat-*這個一個索引問題,並非是es不再自動加載index的原因); 這纔是真正的自定義;當時還真信了官網的鬼話,es7.6.1以後要自己添加索引,不會自動讀取logstash中的配置,shit 。後續補充:(其實人家只是說自己模板)
至此:已完成elk+filebeat部署,正式環境準備用kafaka 替掉filebeat作 ,待續