日誌主要包括系統日誌、應用程序日誌和安全日誌。系統運維和開發人員能夠經過日誌瞭解服務器軟硬件信息、檢查配置過程當中的錯誤及錯誤發生的緣由。常常分析日誌能夠了解服務器的負荷,性能安全性,從而及時採起措施糾正錯誤。
一般,日誌被分散的儲存不一樣的設備上。若是你管理數十上百臺服務器,你還在使用依次登陸每臺機器的傳統方法查閱日誌。這樣是否是感受很繁瑣和效率低下。當務之急咱們使用集中化的日誌管理,例如:開源的syslog,將全部服務器上的日誌收集彙總。
集中化管理日誌後,日誌的統計和檢索又成爲一件比較麻煩的事情,通常咱們使用grep、awk和wc等Linux命令能實現檢索和統計,可是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法不免有點力不從心。
以上,摘自博文 http://blog.51cto.com/baidu/1... 中的介紹。html
ELKF是 Elastic + Logstash + Kibana + FileBeat 四個組件的組合。本文基於elastic 6.1.1講解一個基於日誌文件的ELKF平臺的搭建過程。
在這個系統中,Elastic充當一個搜索引擎,Logstash爲日誌分析上報系統,FileBeat爲日誌文件收集系統,Kibana爲此係統提供可視化的Web界面。該系統各模塊的關係圖以下:java
elastic、logstash須要依賴JVM,下載並安裝linux
x-pack爲elastic的一個擴展程序包,其可提供 安全、監控、告警、報表等功能,下載 https://artifacts.elastic.co/... 後備用。git
下載 https://artifacts.elastic.co/... 並解壓正則表達式
將max file descriptors
調整到至少65536
,不然將會報錯shell
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
將max virtual memory areas vm.max_map_count
調整到至少262144
,不然將會報錯json
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
elastic不能以root身份運行,不然將會報錯:api
don't run elasticsearch as root.
groupadd elasticsearch useradd elasticsearch -g elasticsearch
以後的全部操做均在elasticsearch用戶下執行瀏覽器
./bin/elasticsearch-plugin install file:///somedir/x-pack-6.1.1.zip
出現的全部WARNING均選擇 y
安全
./config/elasticsearch.yml
重點關注如下幾項
# 服務端口 http.port:9200 # 服務綁定網卡地址 network.host:0.0.0.0
./bin/elasticsearch -d
./bin/x-pack/setup-passwords interactive
分別生成 elastic
kibana
logstash-system
三個用戶及其密碼,以備後用
下載 https://artifacts.elastic.co/... 並解壓
./bin/kibana-plugin install file:///somedir/x-pack-6.1.1.zip
時間稍長,還需耐心等待
./config/kibana.yml
重點關注如下幾項
# 服務端口 server.port: 5601 # 服務綁定網卡地址 server.host: 0.0.0.0 # elasticsearch 地址 elasticsearch.url: "http://localhost:9200" # kibana在elastic中的用戶密碼 elasticsearch.username: "kibana" elasticsearch.password: "kibana password"
./bin/kibana
訪問 http://localhost:5601,使用用戶elastic
及其密碼便可登陸
下載 https://artifacts.elastic.co/... 並解壓
./bin/logstash-plugin install file:///somedir/x-pack-6.1.1.zip
curl -X PUT \ http://localhost:9200/_template/manerfan.logs.template \ -H 'Content-Type: application/json' \ -d '{ "index_patterns": [ "manerfan.logs-*" ], "settings": { "index": { "refresh_interval": "5s" } }, "mappings": { "_default_": { "dynamic_templates": [ { "string_fields": { "match": "*", "match_mapping_type": "string", "mapping": { "type": "text", "norms": false } } } ], "properties": { "@timestamp": { "type": "date" }, "@version": { "type": "keyword" }, "geoip": { "dynamic": true, "properties": { "ip": { "type": "ip" }, "location": { "type": "geo_point" }, "latitude": { "type": "half_float" }, "longitude": { "type": "half_float" } } } } } }, "aliases": {} }'
url中_template
後爲模板名,可自由指定
body中index_patterns
爲須要匹配的索引名,能夠指定多項,可使用通配符。本篇中,日誌均使用索引manerfan.logs-*
爲了使logstash能夠正常的建立index、上傳日誌,按照logstash的文檔,須要在elastic中建立兩組角色用戶
curl -X POST \ http://localhost:9200/_xpack/security/role/logstash_writer \ -H 'Content-Type: application/json' \ -d '{ "cluster": ["manage_index_templates", "monitor"], "indices": [ { "names": [ "manerfan.logs-*" ], "privileges": ["write","delete","create_index"] } ] }'
curl -X POST \ http://localhost:9200/_xpack/security/user/logstash_internal \ -H 'Content-Type: application/json' \ -d '{ "password" : "logstash_internal password", "roles" : [ "logstash_writer" ], "full_name" : "Internal Logstash User" }'
curl -X POST \ http://localhost:9200/_xpack/security/role/logstash_reader \ -H 'Content-Type: application/json' \ -d '{ "indices": [ { "names": [ "manerfan.logs-*" ], "privileges": ["read","view_index_metadata"] } ] }'
curl -X POST \ http://localhost:9200/_xpack/security/user/logstash_user \ -H 'Content-Type: application/json' \ -d '{ "password" : "logstash_user password", "roles" : [ "logstash_reader", "logstash_admin"], "full_name" : "Kibana User for Logstash" }'
./config/logstash.yml
重點關注如下幾項
# 服務端口 http.port: 5044 # 服務綁定網卡地址 http.host: 0.0.0.0 # 打開/關閉monitor功能 xpack.monitoring.enabled: "true" # elastic地址 xpack.monitoring.elasticsearch.url: "http://localhost:9200" # logstash_system在elastic中的用戶密碼 xpack.monitoring.elasticsearch.username: "logstash_system" xpack.monitoring.elasticsearch.password: "logstash system password"
./config/logstash.conf
input { beats { port => "5044" } } filter { # [2017-12-12T13:20:00,899] [INFO] [192.168.1.1] [apigateway] c.h.n.RegistryServerApplication [pic:yongy.fan] [keys] Log Content Goes Here # [2017-12-12T13:20:00,899] [INFO] [192.168.1.2] [apigateway] c.h.n.RegistryServerApplication [pic:yongy.fan] Log Content Goes Here # [2017-12-12T13:20:00,899] [INFO] Log Content Goes Here # [2017-12-12T13:20:00,899] Log Content Goes Here # Log Content Goes Here # logtime 日誌時間 # loglevel 日誌級別 # module 日誌來源模塊名 # instancehost 日誌來源服務器ip # pic 負責人 # keys 標籤 # content 日誌內容 # message 原完整日誌內容 grok { match => { "message" => [ "\[%{TIMESTAMP_ISO8601:logtime}\]\s*\[%{LOGLEVEL:loglevel}\]\s*\[%{IPORHOST:instancehost}\]\s*\[%{DATA:module}\]\s*%{JAVACLASS:class}\s*\[pic:%{DATA:pic}\]\s*\[%{DATA:keys}\]\s*%{GREEDYDATA:content}", "\[%{TIMESTAMP_ISO8601:logtime}\]\s*\[%{LOGLEVEL:loglevel}\]\s*\[%{IPORHOST:instancehost}\]\s*\[%{DATA:module}\]\s*%{JAVACLASS:class}\s*\[pic:%{DATA:pic}\]\s*%{GREEDYDATA:content}", "\[%{TIMESTAMP_ISO8601:logtime}\]\s*%{GREEDYDATA:content}", "%{GREEDYDATA:content}" ]} } date { match => [ "logtime", "ISO8601", "yyyy-MM-dd'T'HH:mm:ss.SSS", "yyyy-MM-dd'T'HH:mm:ss,SSS", "yyyy-MM-dd HH:mm:ss.SSS", "yyyy-MM-dd HH:mm:ss,SSS" ] target => "@timestamp" timezone => "Asia/Shanghai" } } output { elasticsearch { hosts => [ "localhost:9200" ] user => "logstash_internal" password => "logstash_internal password" index => "manerfan.logs-%{+YYYY.MM.dd}" manage_template => false template_name => "manerfan.logs.template" } }
input
爲輸入模塊,此處指定了接收filebeat的端口號(稍後使用)filter
爲日誌過濾模塊,此處指定了grok和date
grok
用於日誌分析、信息提取,咱們規定了4種日誌格式,grok使用正則表達式分別匹配,並將關鍵信息(日誌時間、日誌級別、負責人、標籤、等)提取。正在表達式能夠在線進行調試,關於grok正則關鍵詞的使用能夠在這裏查詢date
用於日期解析,因爲日誌文件中使用8時區記錄時間,而elastic會按UTC時間解析,這就形成了在kibana中查看時,日誌時間與實際時間相差了8小時。在date組件中,咱們指定使用Asia/Shanghai
時區解析,並覆蓋@timestamp
字段output
爲輸出模塊,這裏使用elasticsearch將日誌輸出到elastic。這裏須要注意的是,index
爲logstash建立index的規則,這裏天天建立一個index,以日期結尾;templat_name
爲以前建立的模板名
運行如下檢測配置文件是否正確
./bin/logstash -f config/logstash.conf --config.test_and_exit
./bin/logstash -f config/logstash.conf
下載 https://artifacts.elastic.co/... 並解壓
filebeat.yml
重點關注如下幾項
filebeat.prospectors: - type: log # 啓用filebeat enable: true # 配置須要收集的日誌目錄及規則 - paths: - /var/log/manerfan/*.log # 配置多行日誌規則 multiline.pattern: ^\[ multiline.negate: true multiline.match: after # kibana相關配置所有註釋掉 #setup.kibana: # host: "localhost:5601" #elastic相關配置所有註釋掉 #output.elasticsearch: # hosts: ["localhost:9200"] # protocol: "https" # username: "elastic" # password: "changeme" # 配置logstash output.logstash: # logstash地址 hosts: ["localhost:5044"]
./filebeat -e -c filebeat.yml -d "publish"
瀏覽器打開http://localhost:5601
,進入management
標籤,點擊Check for new data
index pattern
使用通配符匹配(配置logstash時,天天都會生成一個新的index)
Time Filter field name
選擇@timestamp
至此,ELFK搭建完畢!
關於如何使用kibana搜索日誌,可自行摸索