日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的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界面。该系统各模块的关系图如下:
一、环境准备
二、各模块安装配置
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
修改配置./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
三个用户及其密码,以备后用
3. kibana
下载 https://artifacts.elastic.co/... 并解压
安装x-pack
./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"
运行kibana
./bin/kibana
访问 http://localhost:5601,使用用户elastic
及其密码即可登录
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
为日志过滤模块,此处指定了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
运行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
index pattern
使用通配符匹配(配置logstash时,每天都会生成一个新的index)
Time Filter field name
选择@timestamp
至此,ELFK搭建完毕!
关于如何使用kibana搜索日志,可自行摸索
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。