使用EFK快速搭建安全可靠的日誌服務

1 前言

EFK是一套分佈式日誌服務解決方案,由各個組件構成。EFK分別是指:elasticsearch、filebeat、kibana。不過在真實的生產環境中,搭建日誌服務可能還須要logstash來進行規制解析,使用kafka進行削峯填谷做爲緩衝。在本文中,我主要介紹如何使用elasticsearch+filebeat+logstash+kibana來快速搭建一套分佈式日誌服務,來接入線上的多個產品線,並進行日誌的統一管理。html

2總體框架及各組件介紹

2.1 總體框架

圖片描述

2.2 各組件簡介

filebeat:做爲agent部署在須要收集日誌的服務所在的機器上,進行日誌的收集;
logstash:接收來自filebeat的日誌流,進行規則解析,寫入到es;
elasticsearch + searchguard:es用於日誌的存儲、查詢;searchguard用於對es索引的安全防禦;
kibana:進行日誌查詢的可視化界面。java

3 日誌收集&傳輸

3.1 logstash做爲agent

在最初的ELK方案中,是將logstash做爲agent部署在各個client上的進行日誌的收集、解析直接寫入到es中。可是在要接入的服務很是多、日質量不斷增大的場景中,這種方式會形成如下影響:json

  • logstash很是佔用內存,會影響到部署到本機器上的線上服務
  • 直接寫es會對es形成很是大的壓力

filebeat使用go進行開發的,其輕量級特性很是適合做爲agent進行部署。在本文的日誌服務中,filebeat所扮演的角色,就是做爲agent進行日誌的收集,以及對於java異常日誌multiline的處理。api

3.2 filebeat做爲agent

各公司都應該有本身的線上服務部署平臺,因爲要收集的服務是分佈在許多不一樣的機器上的。建議將filebeat封裝爲一個服務,直接將二進制包打包到要部署服務的包中,根據不一樣的沙盒或者線上環境加載不一樣的filebeat.yml配置文件進行安裝便可。安全

3.2.1 filebeat的日誌收集文件說明

舉例說明,咱們要收集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

3.2.2 filebeat.yml文件說明

在本文示例中經過filebeat寫入的logstash,所以只須要配置以下幾個部分便可。框架

  • Filebeat modules模塊用於配置3.2.1中對於每一個日誌文件配置的日誌收集文件所在的路徑。
  • Logstash output部分用於配置要寫入的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

4 日誌規則解析

Logstash 是一款強大的數據處理工具,它能夠實現數據傳輸,格式處理,格式化輸出,還有強大的插件功能,經常使用於日誌處理。對於logstash的詳細介紹能夠參考:https://blog.csdn.net/u010739...
本文介紹的日誌服務中,logstash的做用主要是接收來自filebeat收集上來的日誌,匹配不一樣的規則,寫入到不一樣的es索引中。
同filebeat同樣,也很是建議將logstash封裝爲能夠直接部署的服務。咱們重點介紹logstash的基礎配置,以及pipelines的配置。

4.1 logstash.yml配置解析

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同樣,咱們開啓了證書訪問,所以也須要證書相關的支持。更多配置相關的介紹能夠自行百度。後續也會有文章進行詳細介紹。

4.2 pipelines配置解析

pipelines.yml文件主要配置logstash須要加載的pipelines的相關路徑:

- pipeline.id: filebeat-log
  path.config: "pipelines/filebeat-log/*.conf"

4.3 pipelines熱加載

pipelines主要分爲三部分:input、fileter、output,這三部分能夠配置到三個不一樣的配置文件中。
這三個配置文件的改動是熱加載的。logstash會按期進行檢測。

4.3.1 input.conf

主要是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"
    }
}

4.3.2 filter.conf

最挑戰的就是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-]", ""]
        }
    }
}

4.3.3 output.conf

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文件中,方便問題排查。

5 日誌存儲查詢

5.1 elasticsearch

elasticsearch是一個全文檢索引擎,在本文中的日誌服務中主要用於日誌的結構化存儲和查詢。
爲了將不一樣產品線的訪問權限進行隔離,咱們須要在es安裝時加載search-guard插件。
在第一次部署es啓動前須要進行系統配置更新(使用root權限),修改/etc/security/limit.conf,保存後logout而後再login一遍系統

  • hard nofile 65536
  • soft nofile 65536 work hard nofile 65536 work soft nofile 65536
  • soft nproc 4096
  • hard nproc 4096 work soft nproc 4096 work hard nproc 4096 work soft memlock unlimited work hard memlock unlimited

在/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的各個配置文件。

5.2 kibana

kibana用於進行日誌的查詢、報表展現,能夠理解爲es的一個可視化操做界面。
kibana同上述的全部服務,也能夠封裝爲單獨的服務包進行安裝部署,其最主要的就是kibana.yml的配置。主要配置kibana的端口,es的地址,訪問es須要的用戶名、密碼,證書的地址等信息。
使用5,1中分配的帳號進行kibana登陸便可查看對應索引的相關信息。

總結

至此,搭建完上述的各個組件,依次檢查filebeat的日誌是否可以正確收集到對應的日誌文件、logstash可否正確接收到filebeat傳輸過來的信息而且正確解析,檢查es是否可以生成索引,kibana是否可以進行不一樣帳號的登陸以及對應es索引的日誌查詢。沒有問題以後,分佈式日誌服務就搭建完畢了。

相關文章
相關標籤/搜索