在工作中随着业务量的增大和项目的增多,日志量随之增大,我们需要对日志进行集中化管理,将所有机器上的日志信息收集、汇总到一起。完整的日志数据具有非常重要的作用:
1)信息查找:通过检索日志信息,定位相应的bug,找出解决方案。
2)服务诊断:通过对日志信息进行统计、分析,了解服务器的负荷和服务运行状态,找出耗时请求进行优化等等。
3)数据分析:如果是格式化的log,可以做进一步的数据分析,统计、聚合出有意义的信息,比如根据请求中的商品id,找出TOP10用户感兴趣商品。
开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成:
1)ElasticSearch是一个基于Lucene的开源分布式搜索服务器。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。在elasticsearch中,所有节点的数据是均等的。
2)Logstash是一个完全开源的工具,它可以对你的日志进行收集、过滤、分析,支持大量的数据获取方法,并将其存储供以后使用(如搜索)。说到搜索,logstash带有一个web界面,搜索和展示所有日志。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
3)Kibana 是一个基于浏览器页面的Elasticsearch前端展示工具,也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志.
4)beats中的filebeat可以将多台机器的日志数据进行采集发送至logstash或elasticsearch,然后通过kiabana进行页面可视化展示。
(注:安装以上服务需要先安装JAVA,并配置好环境变量)
安装篇
系统环境:CentOS Linux release 7.4.1708 (Core)
软件下载:https://www.elastic.co/downloads (所需的软件都可以在该网站下载,所有软件版本都要保持一致)
,以下提供下载地址:
elasticsearch:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.1.tar.gz
logstash:https://artifacts.elastic.co/downloads/logstash/logstash-5.4.1.tar.gz
kibana:https://artifacts.elastic.co/downloads/kibana/kibana-5.4.1-linux-x86_64.tar.gz
filebeat:https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.4.1-linux-x86_64.tar.gz
1.Elasticsearch 源码包的安装与配置:
解压elasticsearch,我这里用的是elasticsearch-6.5.4:
tar –zvxf elasticsearch-6.5.4.tar.gz
将解压后的elasticsearch-6.5.4放到所需要的目录(自定义我这里放到了/usr/local/):
mv elasticsearch-6.5.4 /usr/loca l/ elasticsearch-6.5.4
到目录下对elasticsearch文件进行配置:
cd /usr/local/ elasticsearch-6.5.4
ll
vim config/elasticsearch.yml
对elasticsearch.yml文件内以下项进行修改:
cluster.name: elk # 组名(同一个组,组名必须一致)
node.name: elk-node1 # 节点名称,建议和主机名一致
path.data: /data/es-data # 数据存放的路径(日志路径可以自定义)
path.logs: /var/log/elasticsearch/ # 日志存放的路径
network.host: 0.0.0.0 # 网络设置
http.port: 9200 # 端口
关于elasticsearch 的启动需要创建一个普通组和用户进行启动,否则启动会报错。
groupadd elklog
adduser elk
useradd -g test phpq //新建phpq用户并增加到test工作组
passwd elklog
对/usr/local/elasticsearch-6.5.4进行赋权;
chown –R elklog.elklog /usr/local/elasticsearch-6.5.4
用户名 密码 目录
切换用户:
su elklog
启动 elasticsearch 服务,在/usr/local/elasticsearch-6.5.4目录下执行:
./bin/elasticsearch -d 后台执行
查看相关端口看是否启动:
netstat-tunpl
也可以通过浏览器进行验证:
http://IP:9200 出现如下页面表示安装成功启动成功。
2.为elasticsearch安装heard插件,安装之前要先安装nodjs插件:
elasticsearch-head 是用于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执行增删改查操作等
下载heard:
git clone git://github.com/mobz/elasticsearch-head.git
等待下载完成后执行以下命令安装grunt-cli :
npm install -g grunt-cli
执行以下命令安装grunt,要在head下载完成后进入到head的文件下执行:
cd elasticsearch-head #进入到head目录
npm install -g cnpm --registry=https://registry.npm.taobao.org
速度较慢或者安装失败,所以使用国内镜像
npm install grunt --save #安装grunt
安装npm依赖包:
# npm install 必须要执行,否则会缺包
所有包安装完成后对heard的Gruntfile.js配置文件进行修改:
vim Gruntfile.js
找到以下信息,增加hostname项:
更改前:
connect: {
server: {
options: {
port: 9100,
base: '.',
keepalive: true
}
}
更改后:
connect: {
server: {
options: {
hostname:’0.0.0.0’,
port: 9100,
base: '.',
keepalive: true
}
}
以上都更改完成后需要添加以下两行到/usr/local/elasticsearch-6.5.4/config/ elasticsearch.yml下面实现可以正常访问:
http.cors.enabled: true
http.cors.allow-origin: "*"
备注后面的值别忘了有空格哦
启动heard插件,要在该插件目录下执行以下命令进行启动:
grunt server
执行后出现以下输出说明启动成功:
Running “connect:server” (connect) task
Waiting forever…
Started connect web server on http://localhost:9100
可通过浏览器进行访问测试一下:
3.安装logstash,也是从https://www.elastic.co/downloads 下载的源码包(所需的软件都可以在该网站下载,所有软件版本都要保持一致)
解压
tar -zvxf logstash-6.5.4.tar.gz
mv logstash-6.5.4 /usr/local/ logstash-6.5.4 #所放目当可自定
1.编辑配置文件,可自行在logstash/conf下创建一个自己需要的.conf文件:
touch logstash.conf
vim logstash.conf
input {
file {
type => "log"
path => "/logs/*.log"
start_position => "beginning"
}
}
output {
stdout {
codec => rubydebug { }
}
elasticsearch {
hosts => "127.0.0.1"
index => "log-%{+YYYY.MM.dd}"
}
}
然后做好input ,filter,output三大块, 其中input是吸取logs文件下的所有log后缀的日志文件,filter是一个过滤函数,这里不用配置,output配置了导入到
hosts为127.0.0.1:9200的elasticsearch中,每天一个索引。
3.配置完成后启动logstash:
./bin/logstash -e config/XXX.conf
关于logstash的配置,下面做一下介绍:
(1)Logstash事件处理有三个阶段:inputs → filters → outputs。是一个接收,处理和转发日志的工具,支持处理所有可以抛出来的日志类型。
(2)Input:输入数据到logstash,file是从文件系统中读取,redis是从缓存中读取,beats是从filebeat中读取。
(3)Filters:数据中间处理,对数据进行操作。
(4)outputs是logstash处理管道的最末端组件。一个event可以在处理过程中经过多重输出,elasticsearch:可以高效的保存数据,并且能够方便和简单的进行查询。file:将event数据保存到文件中。
graphite:将event数据发送到图形化组件中,一个很流行的开源存储图形化展示的组件。
codecs 是基于数据流的过滤器,它可以作为input,output的一部分配置,Codecs可以帮助你轻松的分割发送过来已经被序列化的数据。
4.安装kibana , 从https://www.elastic.co/downloads 下载的源码包(所需的软件都可以在该网站下载,所有软件版本都要保持一致)
解压
tar –zvxf kibana-6.5.4.tar.gz
mv kibana-6.5.4 /usr/local/kibana
修改配置文件:
vim /usr/local/kibana/config/kibana.yml
更改如下:
server.port: 5601 #放开端口
server.host: "0.0.0.0"
server.name: "kabba-server" #kibana服务名
elasticsearch.url: http://IP:9200 # elasticsearch服务的IP地址
配置完成后启动kibana:
./bin/kibana
我的kibana因为之前在logstash里做过日志导入到elasticsearch里,所有已经有LOG分析的数据进行展现了。
5.filebeat的安装配置:
从https://www.elastic.co/downloads 下载的源码包(所需的软件都可以在该网站下载,所有软件版本都要保持一致)
安装很简单,就是将filebeat的源码包解压放到你指定的目录下就行:
tar –zvxf filebeat-6.5.4.tar.gz
mv filebeat-6.5.4 /usr/local/filebeat-6.5.4
配置filebeat:
# vim filebeat.yml
type: log #日志的默认type
enabled: true
paths:
- /tem/logs/*/nod_*.log #配置所要获取的日志路径
fields:
service: nod_log #定义日志的名称
tail_files: true
output.logstash:
hosts: ["1.1.1.1:5044"] #将filebeat获取到的日志转到logstash处理
配置完成后启动filebeat:
# nohup ./filebeat -e -c filebeat.yml > /dev/null 2>&1 & #后端启动
启动后可以到logstash上看出正在对日志处理:
同时通过kibana也能看到filebeat通过logstash处理后的日志:
用的时候最好用后台启动方式
nohup ./kibana &exit
nohup ./logstash -f spring-boot.conf &
filebeat文件的配置样例:
filebeat.prospectors:
- type: log
enabled: true
paths:
- /tmep/logs/*/*.log
fields:
service: nod_log
tail_files: true
..............
output.logstash:
hosts: ["139.224.151.76:5044"]
Logstash文件配置样例:
input {
beats {
port => 5044
}
}
filter {
if [fields][service] == 'nod_log' {
grok {
match => ["message","%{DATA:logtime}\|%{DATA:std}\|%{NUMBER:loss}\|%{NUMBER:delay}$"]
}
date {
match => ["logtime", "yyyy-MM-dd HH:mm:ss"]
target => "@timestamp"
remove_field => ["logtime","message","[beat][version]","[beat][name]","offset","prospector","tags","source"]
}
mutate {
convert => [
"loss" , "float",
"delay" , "integer" ]
}
}
}
output {
if [fields][service] == "pping_log" {
if "_grokparsefailure" not in [tags] {
elasticsearch {
hosts => ["139.224.151.76:9200"]
index => "logstash-ppinglog-%{+YYYY.MM.dd}"
}
}
}
}