日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散在储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
通过我们需要对日志进行集中化管理,将所有机器上的日志信息收集、汇总到一起。完整的日志数据具有非常重要的作用:
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 界面,可以帮助您汇总、分析和搜索重要数据日志。
为什么要用到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终止
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官网下载地址
https://www.elastic.co/cn/downloads