ELKF平台搭建过程

日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。

以上,摘自博文 http://blog.51cto.com/baidu/1... 中的介绍。

ELKF是 Elastic + Logstash + Kibana + FileBeat 四个组件的组合。本文基于elastic 6.1.1讲解一个基于日志文件的ELKF平台的搭建过程。
在这个系统中,Elastic充当一个搜索引擎,Logstash为日志分析上报系统,FileBeat为日志文件收集系统,Kibana为此系统提供可视化的Web界面。该系统各模块的关系图如下:

ELKF系统关系图

一、环境准备

elastic、logstash需要依赖JVM下载并安装


二、各模块安装配置

1. x-pack

x-pack为elastic的一个扩展程序包,其可提供 安全、监控、告警、报表等功能,下载 https://artifacts.elastic.co/... 后备用。


2. elastic

下载 https://artifacts.elastic.co/... 并解压

修改文件句柄数

max file descriptors调整到至少65536,否则将会报错

max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

修改虚拟内存

max virtual memory areas vm.max_map_count调整到至少262144,否则将会报错

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

创建用户组

elastic不能以root身份运行,否则将会报错:

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


订阅号


阅读 3.9k

推荐阅读
林中小舍
用户专栏

工作中的坑点及经验

51 人关注
41 篇文章
专栏主页