日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员能够经过日志了解服务器软硬件信息、检查配置过程当中的错误及错误发生的缘由。常常分析日志能够了解服务器的负荷,性能安全性,从而及时采起措施纠正错误。前端
一般,日志被分散在储存不一样的设备上。若是你管理数十上百台服务器,你还在使用依次登陆每台机器的传统方法查阅日志。这样是否是感受很繁琐和效率低下。当务之急咱们使用集中化的日志管理,例如:开源的syslog,将全部服务器上的日志收集汇总。java
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,通常咱们使用grep、awk和wc等Linux命令能实现检索和统计,可是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法不免有点力不从心。linux
经过咱们须要对日志进行集中化管理,将全部机器上的日志信息收集、汇总到一块儿。完整的日志数据具备很是重要的做用:nginx
1)信息查找。经过检索日志信息,定位相应的bug,找出解决方案。web
2)服务诊断。经过对日志信息进行统计、分析,了解服务器的负荷和服务运行状态,找出耗时请求进行优化等等。正则表达式
3)数据分析。若是是格式化的log,能够作进一步的数据分析,统计、聚合出有意义的信息,好比根据请求中的商品id,找出TOP10用户感兴趣商品。redis
开源实时日志分析ELK平台可以完美的解决咱们上述的问题,ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成:docker
1)ElasticSearch是一个基于Lucene的开源分布式搜索服务器。它的特色有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并做为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,可以达到实时搜索,稳定,可靠,快速,安装使用方便。 shell
在elasticsearch中,全部节点的数据是均等的。apache
2)Logstash是一个彻底开源的工具,它能够对你的日志进行收集、过滤、分析,支持大量的数据获取方法,并将其存储供之后使用(如搜索)。说到搜索,logstash带有一个web界面,搜索和展现全部日志。通常工做方式为c/s架构,client端安装在须要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操做在一并发往elasticsearch上去。
3)Kibana 是一个基于浏览器页面的Elasticsearch前端展现工具,也是一个开源和免费的工具,Kibana能够为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,能够帮助您汇总、分析和搜索重要数据日志。
为何要用到ELK?
通常咱们须要进行日志分析场景是:直接在日志文件中 grep、awk 就能够得到本身想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。须要集中化的日志管理,全部服务器上的日志收集汇总。常看法决思路是创建集中式日志收集系统,将全部节点上的日志统一收集,管理,访问。
通常大型系统是一个分布式部署的架构,不一样的服务模块部署在不一样的服务器上,问题出现时,大部分状况须要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,能够提升定位问题的效率。
一个完整的集中式日志系统,须要包含如下几个主要特色:
1)收集-可以采集多种来源的日志数据
2)传输-可以稳定的把日志数据传输到中央系统
3)存储-如何存储日志数据
4)分析-能够支持 UI 分析
5)警告-可以提供错误报告,监控机制
ELK提供了一整套解决方案,而且都是开源软件,之间互相配合使用,完美衔接,高效的知足了不少场合的应用。目前主流的一种日志系统。
ELK工做原理展现图:
Logstash收集AppServer产生的Log,并存放到ElasticSearch集群中,而Kibana则从ES集群中查询数据生成图表,再返回给Browser。
Logstash工做原理:
Logstash事件处理有三个阶段:inputs → filters → outputs。是一个接收,处理,转发日志的工具。支持系统日志,webserver日志,错误日志,应用日志,总之包括全部能够抛出来的日志类型。
Input:输入数据到logstash。
一些经常使用的输入为:
file:从文件系统的文件中读取,相似于tial -f命令
syslog:在514端口上监听系统日志消息,并根据RFC3164标准进行解析
redis:从redis service中读取
beats:从filebeat中读取
Filters:数据中间处理,对数据进行操做。
一些经常使用的过滤器为:
grok:解析任意文本数据,Grok 是 Logstash 最重要的插件。它的主要做用就是将文本格式的字符串,转换成为具体的结构化的数据,配合正则表达式使用。内置120多个解析语法。
mutate:对字段进行转换。例如对字段进行删除、替换、修改、重命名等。
drop:丢弃一部分events不进行处理。
clone:拷贝 event,这个过程当中也能够添加或移除字段。
geoip:添加地理信息(为前台kibana图形化展现使用)
Outputs:outputs是logstash处理管道的最末端组件。一个event能够在处理过程当中通过多重输出,可是一旦全部的outputs都执行结束,这个event也就完成生命周期。
一些常见的outputs为:
elasticsearch:能够高效的保存数据,而且可以方便和简单的进行查询。
file:将event数据保存到文件中。
graphite:将event数据发送到图形化组件中,一个很流行的开源存储图形化展现的组件。
Codecs:codecs 是基于数据流的过滤器,它能够做为input,output的一部分配置。Codecs能够帮助你轻松的分割发送过来已经被序列化的数据。
一些常见的codecs:
json:使用json格式对数据进行编码/解码。
multiline:将汇多个事件中数据汇总为一个单一的行。好比:java异常信息和堆栈信息。
======================ELK总体方案=======================
ELK中的三个系统分别扮演不一样的角色,组成了一个总体的解决方案。Logstash是一个ELK工具,负责从每台机器抓取日志数据,对数据进行格式转换和处理后,输出到Elasticsearch中存储。Elasticsearch是一个分布式搜索引擎和分析引擎,用于数据存储,可提供实时的数据查询。Kibana是一个数据可视化服务,根据用户的操做从Elasticsearch中查询数据,造成相应的分析结果,以图表的形式展示给用户。
ELK的安装很简单,能够按照"下载->修改配置文件->启动"方法分别部署三个系统,也可使用docker来快速部署。具体的安装方法这里不详细介绍,下面来看一个常见的部署方案,以下图所示,部署思路是:
1)在每台生成日志文件的机器上,部署Logstash,做为Shipper的角色,负责从日志文件中提取数据,可是不作任何处理,直接将数据输出到Redis队列(list)中;
2)须要一台机器部署Logstash,做为Indexer的角色,负责从Redis中取出数据,对数据进行格式化和相关处理后,输出到Elasticsearch中存储;
3)部署Elasticsearch集群,固然取决于你的数据量了,数据量小的话可使用单台服务,若是作集群的话,最好是有3个以上节点,同时还须要部署相关的监控插件;
4)部署Kibana服务,提供Web服务。
在前期部署阶段,主要工做是Logstash节点和Elasticsearch集群的部署,而在后期使用阶段,主要工做就是Elasticsearch集群的监控和使用Kibana来检索、分析日志数据了,固然也能够直接编写程序来消费Elasticsearch中的数据。
采用这样的架构部署,有三点优点:
第一,下降对日志所在机器的影响,这些机器上通常都部署着反向代理或应用服务,自己负载就很重了,因此尽量的在这些机器上少作事;
第二,若是有不少台机器须要作日志收集,那么让每台机器都向Elasticsearch持续写入数据,必然会对Elasticsearch形成压力,所以须要对数据进行缓冲,同时,这样的缓冲也能够必定程度的保护数据不丢失;
第三,将日志数据的格式化与处理放到Indexer中统一作,能够在一处修改代码、部署,避免须要到多台机器上去修改配置。
其次,咱们须要作的是将数据放入一个消息队列中进行缓冲,因此Redis只是其中一个选择,也能够是RabbitMQ、Kafka等等,在实际生产中,Redis与Kafka用的比较多。因为Redis集群通常都是经过key来作分片,没法对list类型作集群,在数据量大的时候必然不合适了,而Kafka天生就是分布式的消息队列系统。
操做篇:
操做环境:
elk-server 192.168.80.181仅主机模式 ELK服务端,接收日志,提供日志搜索服务
nginx-server 192.168.80.182NAT模式 Nginx服务端,产生的访问日志经过上报到Logstash
https://pan.baidu.com/s/1Z6QAQySEixnH9ZVVjTKmXQ (软件包)
192.168.80.181:
hostnamectl set-hostname elk.server //修改主机名
exit //退出Xshell 而后从新链接 便可
yum install lrz* -y //能够从真机中拖入安装包
tar xf jdk-8u144-linux-x64.tar.gz -C /opt/
tar xf kibana-6.2.3-linux-x86_64.tar.gz -C /opt/
tar xf logstash-6.2.3.tar.gz -C /opt/
tar xf elasticsearch-6.2.3.tar.gz -C /opt/
搭建java环境
cd /opt/
cp -r jdk1.8.0_144/ /usr/local/java
vi /etc/profile //最后一行新增
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export PATH=$PATH:/usr/local/java/bin
export CLASSPATH=./:/usr/local/java/lib:/usr/local/java/jre/lib
source /etc/profile
java -version
建立用户
ElasticSerach要求以非root身份启动,因此要建立一个用户:
groupadd elasticsearch
useradd -g elasticsearch elasticsearch
mkdir /usr/local/work
cp -rf elasticsearch-6.2.3/ /usr/local/work/
chown -R elasticsearch.elasticsearch /usr/local/work/elasticsearch-6.2.3
vi /etc/security/limits.conf 新增
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
vi /etc/sysctl.conf //内核配置文件 新增
vm.max_map_count=655360
sysctl -p
重启此台虚拟机
启动ElasticSerach
su elasticsearch
cd /usr/local/work/elasticsearch-6.2.3
bin/elasticsearch -d
tail -f /usr/local/work/elasticsearch-6.2.3/logs/elasticsearch.log
切换到root
curl 127.0.0.1:9200 出现如下内容,表明服务启动
su -
cd /opt/
至此,ElasticSerach服务启动成功,接下来是Logstash
配置和启动Logstash
cp -rf logstash-6.2.3/ /usr/local/work/
cd /usr/local/work/logstash-6.2.3
vi default.conf //新建
input {
beats {
port => "5044"
}
file{
path => ["/usr/local/work/logstash-6.2.3/logs/logstash-plain.log"]
type => "logstash_log"
start_position => "beginning"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
geoip {
source => "clientip"
}
}
output {
elasticsearch {
hosts => ["127.0.0.1:9200"]
}
}
bin/logstash -f default.conf //不可Ctrl+c终止
另开一台80.182,去测试端口开启否
tail -f logs/logstash-plain.log //查看日志
配置和启动Kibana
cp -rf kibana-6.2.3-linux-x86_64/ /usr/local/work/
cd /usr/local/work/kibana-6.2.3-linux-x86_64/
vi config/kibana.yml
server.host: "192.168.80.181"
server.port: "5601"
nohup bin/kibana &
tail -f nohup.out
在浏览器访问http://192.168.80.181:5601
至此,ELK服务启动成功
192.168.80.182:
将业务日志上报上来,须要操做另外一台电脑:nginx-server
安装配置nginx
安装nginx和http用户认证工具
yum -y install epel-release
yum -y install nginx httpd-tools
systemctl start nginx
filebeat 收集日志的工具
tar xf filebeat-6.2.3-linux-x86_64.tar.gz -C /opt
mkdir /usr/local/work/
cp /opt/filebeat-6.2.3-linux-x86_64 /usr/local/work/
cd /usr/local/work/filebeat-6.2.3-linux-x86_64/
vi filebeat.yml
enabled: true //修改
- /var/log/*.log => - /var/log/nginx/*.log
output.elasticsearch: 前面加一个“#”注释掉
hosts: ["localhost:9200"] 前面加一个“#” 注释掉
#output.logstash 去掉注释符号
#host: ["localhost:5400"] 去掉注释符号,并修改成[“192.168.80.100:5400”]
启动FileBeat: ./filebeat -e -c filebeat.yml -d “publish”
建立Index Patterns
经过浏览器多访问几回nginx服务,这样能多制造一些访问日志
访问Kibana:http://192.168.80.181:5601
点击左上角的Discover
能够看到访问日志已经被ELK搜集了
输入logstash-*,点击”Next step”
选择Time Filter,再点击“Create index pattern”
点击左上角的”Discover”按钮,便可看到最新的日志信息
至此,咱们已经能够在ELK上查到Nginx的访问日志了
tomcat
安装和启动Tomcat
确保nginx-server电脑上已经安装了JDK8;
在/usr/local/work/目录下执行如下命令,下载Tomcat:
wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.85/bin/apache-tomcat-7.0.85.zip
解压缩:unzip apache-tomcat-7.0.85.zip
给脚本赋予可执行权限:chmod a+x /usr/local/work/apache-tomcat-7.0.85/bin/*.sh
启动:/usr/local/work/apache-tomcat-7.0.85/bin/startup.sh
浏览器访问:http://192.168.119.133:8080
访问Tomcat提供的example服务的子页面:http://192.168.119.133:8080/examples/servlets/servlet/RequestInfoExample
至此,Tomcat已经启动成功,接下来将Tomcat的访问日志接入ELK
Tomcat访问日志接入ELK
打开FileBeat的配置文件/usr/local/work/filebeat-6.2.3-linux-x86_64/filebeat.yml,在”filebeat.prospectors:”下面新增一个配置节点,内容以下:
- type: log
enabled: true
paths:
- /usr/local/work/apache-tomcat-7.0.85/logs/localhost_access_log.*.txt
停掉filebeat服务,再用./filebeat -e -c filebeat.yml -d “publish”命令启动filebeat服务;
此时在Kibana页面已经能够搜索到Tomcat的访问日志,以“RequestInfoExample”做为关键词搜索也能搜到对应的访问日志
至此,ELK-6.2.3版本的服务和日志上报的搭建已经完成,后续若是还有业务服务器要上报日志,只需按照上述步骤安装和配置FileBeat便可
ELK官网下载地址