一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。 一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。 一个完整的集中式日志系统,需要包含以下几个主要特点: 收集-能够采集多种来源的日志数据 传输-能够稳定的把日志数据传输到中央系统 存储-如何存储日志数据 分析-可以支持 UI 分析 警告-能够提供错误报告,监控机制 ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。目前主流的一种日志系统。
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。 Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。 Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。 Filebeat隶属于Beats。目前Beats包含四种工具: Packetbeat(搜集网络流量数据) Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据) Filebeat(搜集文件数据) Winlogbeat(搜集 Windows 事件日志数据)
最简单架构 这种架构非常简单,使用场景也有限。初学者可以搭建这个架构,了解 ELK 如何工作。 Logstash 作为日志搜集器 这种架构是对上面架构的扩展,把一个 Logstash 数据搜集节点扩展到多个,分布于多台机器,将解析好的数据发送到 Elasticsearch server 进行存储,最后在 Kibana 查询、生成日志报表等
这种结构因为需要在各个服务器上部署 Logstash,而它比较消耗 CPU 和内存资源,所以比较适合计算资源丰富的服务器,否则容易造成服务器性能下降,甚至可能导致无法正常工作。 Beats 作为日志搜集器 这种架构引入 Beats 作为日志搜集器。目前 Beats 包括四种: 引入消息队列机制的架构 到笔者整理本文时,Beats 还不支持输出到消息队列,所以在消息队列前后两端只能是 Logstash 实例。这种架构使用 Logstash 从各个数据源搜集数据,然后经消息队列输出插件输出到消息队列中。目前 Logstash 支持 Kafka、Redis、RabbitMQ 等常见消息队列。然后 Logstash 通过消息队列输入插件从队列中获取数据,分析过滤后经输出插件发送到 Elasticsearch,最后通过 Kibana 展示。
ELK安装准备工作: 准备3台机器,这样才能完成分布式集群的实验, 192.168.61.131 192.168.61.146 192.168.61.147
角色划分: 3台机器全部安装jdk1.8,因为elasticsearch是java开发的 3台全部安装elasticsearch (后续都简称为es) 192.168.61.131作为主节点 192.168.61.146以及192.168.61.147作为数据节点 主节点上需要安装kibana 在192.168.61.146上安装 logstash
配置三台机器的hosts文件内容如下: vim /etc/hosts 192.168.61.131 master-node 192.168.61.146 data-node1 192.168.61.147 data-node2
关闭防火墙关闭selinux systemctl stop firewalld setenforce 0
**配置3台机器的jdk** tar -xzvf jdk-8u211-linux-x64.tar.gz mkdir /usr/java mv jdk1.8.0_211/ /usr/java/jdk18 # 配置java环境变量 vi /etc/profile # 将下列放到到/etc/profile export JAVA_HOME=/usr/java/jdk18 export PATH=$PATH:$JAVA_HOME/bin # 让环境变量生效 source /etc/profile # 测试java的环境变量是否配置好了 [root@localhost ~]# java -version java version "1.8.0_211" Java(TM) SE Runtime Environment (build 1.8.0_211-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)安装es: wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.rpm rpm -ivh elasticsearch-6.0.0.rpm
[root@localhost ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.rpm --2019-05-20 09:36:39-- https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.rpm Resolving artifacts.elastic.co (artifacts.elastic.co)... 151.101.110.222, 2a04:4e42:1a::734 Connecting to artifacts.elastic.co (artifacts.elastic.co)|151.101.110.222|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 27970243 (27M) [binary/octet-stream] Saving to: ‘elasticsearch-6.0.0.rpm’ 100%[=============================================================>] 27,970,243 181KB/s in 2m 7s 2019-05-20 09:38:46 (216 KB/s) - ‘elasticsearch-6.0.0.rpm’ saved [27970243/27970243]配置es: elasticsearch配置文件在这两个地方,有两个配置文件:
[root@localhost ~]# cd /etc/elasticsearch/ls [root@localhost elasticsearch]# ll total 16 -rw-rw----. 1 root elasticsearch 2870 Nov 11 2017 elasticsearch.yml -rw-rw----. 1 root elasticsearch 2678 Nov 11 2017 jvm.options -rw-rw----. 1 root elasticsearch 5091 Nov 11 2017 log4j2.propertieselasticsearch.yml 文件用于配置集群节点等相关信息的,elasticsearch 文件则是配置服务本身相关的配置,例如某个配置文件的路径以及java的一些路径配置.
继续再修改一个参数 vi /etc/security/limits.d/20-nproc.conf
soft nproc 4096root soft nproc unlimited
:修改内核参数 limits.conf:
需要修改几个参数,不然启动会报错 vim /etc/security/limits.conf 在末尾追加以下内容(*为启动用户,当然也可以指定为某个用户名)
soft nofile 65536
hard nofile 65536
soft nproc 2048
hard nproc 2048
soft memlock unlimited
hard memlock unlimited
**配置集群节点,在 192.168.61.131上编辑配置文件: (主节点)**vi /etc/elasticsearch/elasticsearch.yml
[root@localhost ~]# vi /etc/elasticsearch/elasticsearch.yml cluster.name: master-node node.name: master node.master: true node.data: false bootstrap.memory_lock: false network.host: 0.0.0.0 http.port: 9200 discovery.zen.ping.unicast.hosts: ["192.168.61.131 ", "192.168.61.146", "192.168.61.147"]在 192.168.61.146上编辑配置文件:(数据节点) vi /etc/elasticsearch/elasticsearch.yml
cluster.name: master-node node.name: data-node1 node.master: false node.data: true bootstrap.memory_lock: false network.host: 0.0.0.0 http.port: 9200 discovery.zen.ping.unicast.hosts: ["192.168.61.131", "192.168.61.146", "192.168.61.147"]在 192.168.61.147上编辑配置文件:(数据节点) vi /etc/elasticsearch/elasticsearch.yml
配置java虚拟机内存
把1g改为512m(系统默认是1g,我们做实验,虚拟机内存达不到1g会报错) vim /etc/elasticsearch/jvm.options -Xms1g -Xmx1g #改为 -Xms512m -Xmx512m
**启动主节点服务以及数据节点服务**systemctl start elasticsearch 主节点启动完成之后,再启动其他节点的es服务。
es集群创建完毕 测试 这里的ip应该是192.168.61.131:9200 curl查看es集群情况
集群的健康检查:
[root@localhost /]# curl '192.168.61.131:9200/_cluster/health?pretty' { "cluster_name" : "master-node", "status" : "green", "timed_out" : false, "number_of_nodes" : 1, "number_of_data_nodes" : 0, "active_primary_shards" : 0, "active_shards" : 0, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 }搭建kibana和logstash服务器
安装kibana 在主节点安装 yum 安装下载好的包 安装过后配置kibana:
vi /etc/kibana/kibana.yml # 增加以下内容 server.port: 5601 # 配置kibana的端口 server.host: 192.168.61.131 # 配置监听ip (kibana 自己的ip服务器地址) elasticsearch.url: "http://192.168.61.131:9200" # 配置es服务器的ip,如果是集群则配置该集群中主节点的ip logging.dest: /var/log/kibana.log # 配置kibana的日志文件路径,不然默认是messages里记录日志创建日志文件 启动kibana服务,并监听进程和端口监听: 如果这个问题,遇到的问题安装kibana一直报Kibana server is not ready yet 就要检查之前的步骤,我之前可能忘记配 /etc/hosts 三条记录都要添加 浏览器访问192.168.61.131:5601 kibana安装完成了,下一步安装logstash。
在192.168.61.146上安装logstash 通过yum安装
测试: 安装完之后,先不要启动服务,先配置logstash收集syslog日志: vim /etc/logstash/conf.d/syslog.conf # 加入如下内容 input { # 定义日志源 syslog { type => “system-syslog” # 定义类型 port => 10514 # 定义监听端口 } } output { # 定义日志输出 stdout { codec => rubydebug # 将日志输出到当前的终端上显示 } } 检测配置文件是否有错: [root@data-node1 ~]# cd /usr/share/logstash/bin [root@data-node1 /usr/share/logstash/bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit 为 ok 表示 配置没问题
命令说明: –path.settings 用于指定logstash的配置文件所在的目录 -f 指定需要被检测的配置文件的路径 –config.test_and_exit 指定检测完之后就退出,不然就会直接启动了
配置kibana服务器的ip以及配置的监听端口:
[root@data-node1 ~]# vim /etc/rsyslog.conf ‘#### RULES####’ 在这个下面添加如下 . @@192.168.61.146:10514
重启rsyslog,让配置生效: [root@data-node1 ~]# systemctl restart rsyslog
指定配置文件,启动logstash:
[root@data-node1 ~]# cd /usr/share/logstash/bin [root@data-node1 /usr/share/logstash/bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf
这时终端会停留在这里,因为我们在配置文件中定义的是将信息输出到当前终端 打开新终端检查一下10514端口是否已被监听: 然后在别的机器ssh登录到这台机器上,测试一下有没有日志输出: 如上,可以看到,终端中以JSON的格式打印了收集到的日志,测试成功。
配置logstash
以上只是测试的配置,这一步我们需要重新改一下配置文件,让收集的日志信息输出到es服务器中,而不是当前终端: [root@data-node1 ~]# vim /etc/logstash/conf.d/syslog.conf # 更改为如下内容 input { syslog { type => “system-syslog” port => 10514 } } output { elasticsearch { hosts => [“192.168.61.131:9200”] # 定义es服务器的ip index => “system-syslog-%{+YYYY.MM}” # 定义索引 } }
同样的需要检测配置文件有没有错: [root@data-node1 ~]# cd /usr/share/logstash/bin [root@data-node1 /usr/share/logstash/bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exit 没问题后,启动logstash服务,并检查进程以及监听端口: [root@data-node1 ~]# systemctl start logstash [root@data-node1 ~]# ps aux |grep logstash
解决没有端口的问题: chown logstash /var/log/logstash/logstash-plain.log
[root@data-node1 bin]# ll /var/lib/logstash/ total 4 drwxr-xr-x. 2 root root 6 May 21 10:39 dead_letter_queue drwxr-xr-x. 2 root root 6 May 21 10:39 queue -rw-r–r--. 1 root root 36 May 21 10:51 uuid
[root@data-node1 bin]# chown -R logstash /var/lib/logstash/ [root@data-node1 bin]# systemctl restart logstash
但是可以看到,logstash的监听ip是127.0.0.1这个本地ip,本地ip无法远程通信,所以需要修改一下配置文件,配置一下监听的ip: [root@data-node1 ~]# vim /etc/logstash/logstash.yml http.host: “192.168.160.146”
kibana上查看日志 完成了logstash服务器的搭建之后,回到kibana服务器上查看日志,执行以下命令可以获取索引信息: [root@master-node elasticstack]# curl ‘192.168.61.131:9200/_cat/indices?v’ 如上,可以看到,在logstash配置文件中定义的system-syslog索引成功获取到了,证明配置没问题,logstash与es通信正常。
获取指定索引详细信息: [root@master-node elasticstack]# curl -XGET ‘192.168.61.131:9200/system-syslog-2019.05?pretty’ 如果日后需要删除索引的话,使用以下命令可以删除指定索引: curl -XDELETE ‘localhost:9200/system-syslog-2019.05’
es与logstash能够正常通信后就可以去配置kibana了,浏览器访问192.168.61.131:5601,到kibana页面上配置索引 创建索引模式 创建索引模式 点击发现 其实这里显示的日志数据就是 /var/log/messages 文件里的数据,因为logstash里配置的就是收集messages 文件里的数据。 以上这就是如何使用logstash收集系统日志,输出到es服务器上,并在kibana的页面上进行查看
192.168.160.147 安装 一、安装filebeat及使用filebeat收集日志 1、filebeat的概述 Filebeat是一个日志文件托运工具,在服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并且转发这些信息发送非elasticsearch或者logstarsh。 Filebeat相对于logstash而言,更轻量级,占用系统资源少。
2、filebeat的下载安装 Filebeat需要安装在收集日志的服务器上,即日志所在的服务器上,然后将所在服务器的指定日志发送给logstash或者elasticsearch。
rpm -ivh filebeat-6.7.2-x86_64.rpm
需要修改的配置项为:
vim /etc/filebeat/filebeat.yml filebeat.inputs:
type: log enabled: true paths: /var/log/*.log 你要收集的日志的地址output.elasticsearch: hosts: [“192.168.61.131:9200”] elasticsearch的地址
4、启动filebeat Filebeat启动后,filebeat会实时将配置文件中指定需要收集的日志发送给elasticsearch。 systemctl start filebeat
查看索引有没有成功: [root@master-node elasticstack]# curl ‘192.61.131:9200/_cat/indices?v’ 有filebeat 索引成功
在kibana 上创建filebeat-* 索引 创建方法跟上边创建系统日志方法一样