ELKF平臺搭建過程

日誌主要包括系統日誌、應用程序日誌和安全日誌。系統運維和開發人員能夠經過日誌瞭解服務器軟硬件信息、檢查配置過程當中的錯誤及錯誤發生的緣由。常常分析日誌能夠了解服務器的負荷,性能安全性,從而及時採起措施糾正錯誤。
一般,日誌被分散的儲存不一樣的設備上。若是你管理數十上百臺服務器,你還在使用依次登陸每臺機器的傳統方法查閱日誌。這樣是否是感受很繁瑣和效率低下。當務之急咱們使用集中化的日誌管理,例如:開源的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

ELKF系統關係圖

1、環境準備

elastic、logstash須要依賴JVM下載並安裝linux


2、各模塊安裝配置

1. x-pack

x-pack爲elastic的一個擴展程序包,其可提供 安全、監控、告警、報表等功能,下載 https://artifacts.elastic.co/... 後備用。git


2. elastic

下載 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用戶下執行瀏覽器

安裝x-pack

./bin/elasticsearch-plugin install file:///somedir/x-pack-6.1.1.zip

出現的全部WARNING均選擇 y安全

elastic_install_xpack

修改配置./config/elasticsearch.yml

重點關注如下幾項

# 服務端口
http.port:9200
# 服務綁定網卡地址 
network.host:0.0.0.0

運行elastic

./bin/elasticsearch -d

手動生成密碼

./bin/x-pack/setup-passwords interactive

分別生成 elastic kibana logstash-system 三個用戶及其密碼,以備後用

elastic_generate_passwd


3. kibana

下載 https://artifacts.elastic.co/... 並解壓

安裝x-pack

./bin/kibana-plugin install file:///somedir/x-pack-6.1.1.zip

時間稍長,還需耐心等待

kibana_insall_xpack

修改配置./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"

運行kibana

./bin/kibana

訪問 http://localhost:5601,使用用戶elastic及其密碼便可登陸

kibana_home


4. logstash

下載 https://artifacts.elastic.co/... 並解壓

安裝x-pack

./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爲日誌過濾模塊,此處指定了grokdate

  • 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

運行logstash

./bin/logstash -f config/logstash.conf

5. filebeat

下載 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

./filebeat -e -c filebeat.yml -d "publish"

配置kibana

瀏覽器打開http://localhost:5601,進入management標籤,點擊Check for new data
management

index pattern使用通配符匹配(配置logstash時,天天都會生成一個新的index)
select_index

Time Filter field name選擇@timestamp
select_time_filter

至此,ELFK搭建完畢!

關於如何使用kibana搜索日誌,可自行摸索

log_view


訂閱號

相關文章
相關標籤/搜索