EFK是一套分佈式日誌服務解決方案,由各個組件構成。EFK分別是指:elasticsearch、filebeat、kibana。不過在真實的生產環境中,搭建日誌服務可能還須要logstash來進行規制解析,使用kafka進行削峯填谷做爲緩衝。在本文中,我主要介紹如何使用elasticsearch+filebeat+logstash+kibana來快速搭建一套分佈式日誌服務,來接入線上的多個產品線,並進行日誌的統一管理。html
filebeat:做爲agent部署在須要收集日誌的服務所在的機器上,進行日誌的收集;
logstash:接收來自filebeat的日誌流,進行規則解析,寫入到es;
elasticsearch + searchguard:es用於日誌的存儲、查詢;searchguard用於對es索引的安全防禦;
kibana:進行日誌查詢的可視化界面。java
在最初的ELK方案中,是將logstash做爲agent部署在各個client上的進行日誌的收集、解析直接寫入到es中。可是在要接入的服務很是多、日質量不斷增大的場景中,這種方式會形成如下影響:json
filebeat使用go進行開發的,其輕量級特性很是適合做爲agent進行部署。在本文的日誌服務中,filebeat所扮演的角色,就是做爲agent進行日誌的收集,以及對於java異常日誌multiline的處理。api
各公司都應該有本身的線上服務部署平臺,因爲要收集的服務是分佈在許多不一樣的機器上的。建議將filebeat封裝爲一個服務,直接將二進制包打包到要部署服務的包中,根據不一樣的沙盒或者線上環境加載不一樣的filebeat.yml配置文件進行安裝便可。安全
舉例說明,咱們要收集sonofelice模塊的sonofelice.debug.log中的日誌,針對這一個日誌文件須要配置一個sonofelice_debug.yml日誌收集文件,以便filebeat開啓一個harvest通道開始日誌收集。具體配置示例以下:bash
- type: log enabled: true paths: - /home/work/logs/sonofelice/debug/sonofelice.debug.log - /home/work/logs/sonofelice/debug/sonofelice.debug.log*/*.debug.log ignore_older: 72h close_inactive: 1h multiline: pattern: '^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d' negate: true match: after fields: productline: test module: sonofelice submodule: api type: debug language: java logpattern: java-std region: bj
在上述配置中,必選項及解釋能夠參考博客:https://www.cnblogs.com/smile...
上述配置中的各個字段會對應爲es中的具體的document中的field。app
在本文示例中經過filebeat寫入的logstash,所以只須要配置以下幾個部分便可。框架
#============================= Filebeat modules =============================== filebeat.config.modules: # Glob pattern for configuration loading path: ${path.config}/modules.d/*.yml # Set to true to enable config reloading reload.enabled: true # Period on which files under path should be checked for changes reload.period: 10s path.data: /home/filebeat/data filebeat.shutdown_timeout: 300s filebeat.config.inputs: enabled: true path: inputs/*.yml reload.enabled: true reload.period: 10s queue.mem: events: 4096 flush.min_events: 512 flush.timeout: 1s #output.console: # pretty: true #----------------------------- Logstash output -------------------------------- output.logstash: # The Logstash hosts hosts: ["logstash-hosts1:5044", "logstash-hosts2:5044", "logstash-hosts3:5044"] loadbalance: true # Optional SSL. By default is off. # List of root certificates for HTTPS server verifications ssl.certificate_authorities: ['${FILEBEAT_ROOT_CA_PATH}'] # Certificate for SSL client authentication ssl.certificate: '${FILEBEAT_CRT_PEM_PATH}' # Client Certificate Key ssl.key: '${FILEBEAT_KEY_PEM_PATH}'
爲了確保安全性,咱們開啓了證書訪問,關於證書的生成部分,另有相關文章介紹,此處再也不贅述。elasticsearch
若是但願將filebeat的相關監控信息寫入到es,能夠啓用xpack monitoring,配置以下:分佈式
#============================== Xpack Monitoring =============================== # filebeat can export internal metrics to a central Elasticsearch monitoring # cluster. This requires xpack monitoring to be enabled in Elasticsearch. The # reporting is disabled by default. # Set to true to enable the monitoring reporter. xpack.monitoring.enabled: true # Uncomment to send the metrics to Elasticsearch. Most settings from the # Elasticsearch output are accepted here as well. Any setting that is not set is # automatically inherited from the Elasticsearch output configuration, so if you # have the Elasticsearch output configured, you can simply uncomment the # following line. xpack.monitoring.elasticsearch: hosts: ["es-host1:9920","es-host2:9920","es-host3:9920"] protocol: "https" username: "filebeat_system" password: "abcdefg" ssl.enabled: true ssl.verification_mode: full ssl.certificate_authorities: ['${FILEBEAT_ROOT_CA_PATH}'] # metric http server http.enabled: true http.host: localhost http.port: 5066
Logstash 是一款強大的數據處理工具,它能夠實現數據傳輸,格式處理,格式化輸出,還有強大的插件功能,經常使用於日誌處理。對於logstash的詳細介紹能夠參考:https://blog.csdn.net/u010739...
本文介紹的日誌服務中,logstash的做用主要是接收來自filebeat收集上來的日誌,匹配不一樣的規則,寫入到不一樣的es索引中。
同filebeat同樣,也很是建議將logstash封裝爲能夠直接部署的服務。咱們重點介紹logstash的基礎配置,以及pipelines的配置。
pipeline.batch.size: 500 pipeline.batch.delay: 100 config.reload.automatic: true config.reload.interval: 30s queue.type: persisted path.queue: /home/logstash/data/queue queue.max_bytes: 4gb queue.checkpoint.writes: 256 dead_letter_queue.enable: true dead_letter_queue.max_bytes: 100gb path.dead_letter_queue: /home/logstash/data/dead_letter_queue http.host: "127.0.0.1" http.port: 5044 # ------------ X-Pack Settings (not applicable for OSS build)-------------- # # X-Pack Monitoring # https://www.elastic.co/guide/en/logstash/current/monitoring-logstash.html xpack.monitoring.enabled: true xpack.monitoring.elasticsearch.username: logstash_system xpack.monitoring.elasticsearch.password: kdhlr953 xpack.monitoring.elasticsearch.url: ["https://es-host1:9920","https://es-host2:9920","https://es-host3:9920"] xpack.monitoring.elasticsearch.ssl.truststore.path: /home/work/certificate/truststore.jks xpack.monitoring.elasticsearch.ssl.truststore.password: sjaifdakdjf xpack.monitoring.elasticsearch.ssl.verification_mode: certificate xpack.monitoring.elasticsearch.sniffing: false xpack.monitoring.collection.interval: 10s xpack.monitoring.collection.pipeline.details.enabled: true
跟filebeat同樣,咱們開啓了證書訪問,所以也須要證書相關的支持。更多配置相關的介紹能夠自行百度。後續也會有文章進行詳細介紹。
pipelines.yml文件主要配置logstash須要加載的pipelines的相關路徑:
- pipeline.id: filebeat-log path.config: "pipelines/filebeat-log/*.conf"
pipelines主要分爲三部分:input、fileter、output,這三部分能夠配置到三個不一樣的配置文件中。
這三個配置文件的改動是熱加載的。logstash會按期進行檢測。
主要是filter-beats插件的配置,配置示例以下:
input { beats { port => 5044 client_inactivity_timeout => 600 ssl => true ssl_certificate_authorities => ["/home/work/certificate/chain-ca.pem"] ssl_certificate => "/home/work/certificate/server.crt.pem" ssl_key => "/home/work/certificate/server.key.pem" ssl_verify_mode => "force_peer" } }
最挑戰的就是fileter的配置部分。強烈推薦定義規則時先使用grok調試器進行在線調試後再加載到logstash中。https://grokdebug.herokuapp.com/
配置參考以下:
filter { # 備份一下事件時間,@timestamp在後面的日誌處理過程當中會被替換成日誌內容中的時間 mutate { copy => { "@timestamp" => "event_timestamp" } } if [fields][language] == "go" and [fields][type] == "info" { grok { match => { "message" => "^\[%{GO_TIMESTAMP:[@metadata][log_timestamp]}\]\s+\[%{DATA:log_level}\]" } pattern_definitions => { "GO_TIMESTAMP" => "%{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND} %{TZ}" } } date { match => ["[@metadata][log_timestamp]", "yyyy/MM/dd HH:mm:ss z"] timezone => "Asia/Shanghai" } } if ![@metadata][index_name] { mutate { add_field => {"[@metadata][index_name]" => "%{[fields][productline]}-%{[fields][logpattern]}-%{[fields][type]}"} } } if ![@metadata][document_id] { mutate { add_field => {"[@metadata][document_id]" => "%{[@timestamp]}%{[offset]}%{[host][name]}"} } mutate { gsub => ["[@metadata][document_id]", "[.:TZ-]", ""] } } }
output { if "_grokparsefailure" in [tags] or "_jsonparsefailure" in [tags] { file { path => "/home/work/logstash/failure_output/failure-%{+YYYY-MM-dd}.log" } } else { elasticsearch { hosts => ["https://es-host1:9920","https://es-host2:9920","https://es-host3:9920"] index => "logstash-%{[@metadata][index_name]}-%{+YYYY.MM.dd}" document_id => "%{[@metadata][document_id]}" ssl => true ssl_certificate_verification => true truststore => "/home/work/certificate/truststore.jks" truststore_password => "adofkoe" user => "logstash" password => "dafodmfkamkefadfg" } } }
若是filebeat收集的日誌不知足fileter.conf中配置的grok表達式,會統一寫入到failure文件中,方便問題排查。
elasticsearch是一個全文檢索引擎,在本文中的日誌服務中主要用於日誌的結構化存儲和查詢。
爲了將不一樣產品線的訪問權限進行隔離,咱們須要在es安裝時加載search-guard插件。
在第一次部署es啓動前須要進行系統配置更新(使用root權限),修改/etc/security/limit.conf,保存後logout而後再login一遍系統
在/etc/sysctl.conf加入 vm.max_map_count=262144 保存後執行sysctl -p
對於search-guard插件,能夠將es封裝爲可獨立部署的線上服務,在部署腳本中加載search-guard插件。關於插件的安裝在本文中先不進行過多介紹,重點介紹一下search-guard插件的帳號體系配置。
sgconfig中的用戶密碼須要經過執行es節點部署路徑中plugin/search-guard-6/tools/hash.sh腳原本生成hash值。 執行命令爲bash hash.sh -p $PASSWORD 而後將生成的hash填入sg_internal_users.yml中,並執行bin/sg_update.sh腳本
具體執行步驟以下:
第一步: 在es節點部署路徑中,執行如下命令,獲得一個哈希值
bash plugins/search-guard-6/tools/hash.sh -p tsdb123
第二步: 將第一步中的哈希值寫入到sgconfig目錄下的sg_internal_users.yml文件中
#password is: tsdb123 tsdb: hash: $2y$12$nRgsuDYm36ZKCTjPf3/CeusU9BSGNDCOGOC.JKT7lhj9tVE.nVtS2 roles: - tsdb
此處填寫的roles: -tsdb角色須要在
第三步: 在sg_roles_mapping.yml文件中添加角色映射
sg_tsdb: readonly: true backendroles: - tsdb
第四步: 在sg_roles.yml文件中添加索引控制。此處添加kibana是爲了讓用戶能夠有kibana的訪問權限,不然是沒法經過kibana進行查詢的。
sg_tsdb: readonly: true cluster: - CLUSTER_COMPOSITE_OPS_RO indices: 'logstash-tsdb-*': '*': - READ '?kibana*': '*': - READ
第五步: 生效配置,執行如下命令:
sh bin/sg_update.sh sgconfig/
其中sg_update.sh腳本能夠自行編寫,主要用於加載sg的各個配置文件。
kibana用於進行日誌的查詢、報表展現,能夠理解爲es的一個可視化操做界面。
kibana同上述的全部服務,也能夠封裝爲單獨的服務包進行安裝部署,其最主要的就是kibana.yml的配置。主要配置kibana的端口,es的地址,訪問es須要的用戶名、密碼,證書的地址等信息。
使用5,1中分配的帳號進行kibana登陸便可查看對應索引的相關信息。
至此,搭建完上述的各個組件,依次檢查filebeat的日誌是否可以正確收集到對應的日誌文件、logstash可否正確接收到filebeat傳輸過來的信息而且正確解析,檢查es是否可以生成索引,kibana是否可以進行不一樣帳號的登陸以及對應es索引的日誌查詢。沒有問題以後,分佈式日誌服務就搭建完畢了。