• 设备
    • 今日
    • 12

    搭建ELK日志分析平台

    搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群

    内容:搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群
    日期:2019-04-18

    1 ELK介绍
    2 ELK安装准备工作
    3 安装es
    4 配置es
    5 curl查看es集群情况
    ELK介绍
    需求背景:

    业务发展越来越庞大,服务器越来越多
    各种访问日志、应用日志、错误日志量越来越多,导致运维人员无法很好的去管理日志
    开发人员排查问题,需要到服务器上查日志,不方便
    运营人员需要一些数据,需要我们运维到服务器上分析日志
    为什么要用到ELK:

    一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大也就是日志量多而复杂的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。

    大型系统通常都是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。

    一个完整的集中式日志系统,需要包含以下几个主要特点:

    收集-能够采集多种来源的日志数据
    传输-能够稳定的把日志数据传输到中央系统
    存储-如何存储日志数据
    分析-可以支持 UI 分析
    警告-能够提供错误报告,监控机制
    而ELK则提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。是目前主流的一种日志系统。

    ELK简介:

    ELK是三个开源软件的缩写,分别为:Elasticsearch 、 Logstash以及Kibana , 它们都是开源软件。不过现在还新增了一个Beats,它是一个轻量级的日志收集处理工具(Agent),Beats占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具,目前由于原本的ELK Stack成员中加入了 Beats 工具所以已改名为Elastic Stack。

    Elastic Stack包含:

    Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。详细可参考Elasticsearch权威指南

    Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。

    Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。

    Beats在这里是一个轻量级日志采集器,其实Beats家族有6个成员,早期的ELK架构中使用Logstash收集、解析日志,但是Logstash对内存、cpu、io等资源消耗比较高。相比 Logstash,Beats所占系统的CPU和内存几乎可以忽略不计
    ELK Stack (5.0版本之后)--> Elastic Stack == (ELK Stack + Beats)。目前Beats包含六种工具:

    Packetbeat: 网络数据(收集网络流量数据)
    Metricbeat: 指标 (收集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
    Filebeat: 日志文件(收集文件数据)
    Winlogbeat: windows事件日志(收集 Windows 事件日志数据)
    Auditbeat:审计数据 (收集审计日志)
    Heartbeat:运行时间监控 (收集系统运行时的数据)
    关于x-pack工具:

    x-pack对Elastic Stack提供了安全、警报、监控、报表、图表于一身的扩展包,是收费的,所以本文不涉及x-pack的安装
    ELK官网:

    https://www.elastic.co/cn/

    中文指南:

    https://www.gitbook.com/book/chenryn/elk-stack-guide-cn/details

    ELK架构图:
    搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群

    ELK安装准备工作
    准备3台机器,这样才能完成分布式集群的实验,当然能有更多机器更好:

    192.168.77.128
    192.168.77.130
    192.168.77.134
    角色划分:

    3台机器全部安装jdk1.8,因为elasticsearch是java开发的
    3台全部安装elasticsearch (后续都简称为es)
    192.168.77.128作为主节点
    192.168.77.130以及192.168.77.134作为数据节点
    主节点上需要安装kibana
    在192.168.77.130上安装 logstash
    ELK版本信息:

    Elasticsearch-6.0.0
    logstash-6.0.0
    kibana-6.0.0

    filebeat-6.0.0

    wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.0.0-x86_64.rpm

    配置三台机器的hosts文件内容如下:

    $ vim /etc/hosts
    192.168.77.128 master-node
    192.168.77.130 data-node1
    192.168.77.134 data-node2
    然后三台机器都得关闭防火墙或清空防火墙规则。

    安装es
    先上官方的安装文档:

    https://www.elastic.co/guide/en/elastic-stack/current/installing-elastic-stack.html

    我这里也是通过官方给的源进行安装,以下操作3台机器上都要执行,因为三台机器都需要安装es:

    [root@master-node ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
    [root@master-node ~]# vim /etc/yum.repos.d/elastic.repo  # 增加以下内容
    [elasticsearch-6.x]
    name=Elasticsearch repository for 6.x packages
    baseurl=https://artifacts.elastic.co/packages/6.x/yum
    gpgcheck=1
    gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
    enabled=1
    autorefresh=1
    type=rpm-md
    [root@master-node ~]# yum install -y elasticsearch
    如果使用官方的源下载实在太慢的话,也可以直接下载rpm包进行安装:

    [root@master-node ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.rpm
    [root@master-node ~]# rpm -ivh elasticsearch-6.0.0.rpm
    配置es
    elasticsearch配置文件在这两个地方,有两个配置文件:

    [root@master-node ~]# ll /etc/elasticsearch
    总用量 16
    -rw-rw---- 1 root elasticsearch 2869 2月  17 03:03 elasticsearch.yml
    -rw-rw---- 1 root elasticsearch 2809 2月  17 03:03 jvm.options
    -rw-rw---- 1 root elasticsearch 5091 2月  17 03:03 log4j2.properties
    [root@local ~]# ll /etc/sysconfig/elasticsearch
    -rw-rw---- 1 root elasticsearch 1613 2月  17 03:03 /etc/sysconfig/elasticsearch
    [root@master-node ~]#
    elasticsearch.yml 文件用于配置集群节点等相关信息的,elasticsearch 文件则是配置服务本身相关的配置,例如某个配置文件的路径以及java的一些路径配置什么的。

    官方的配置文档:

    https://www.elastic.co/guide/en/elasticsearch/reference/6.0/rpm.html

    开始配置集群节点,在 192.168.77.128 上编辑配置文件:

    [root@master-node ~]# vim /etc/elasticsearch/elasticsearch.yml  # 增加或更改以下内容
    cluster.name: master-node  # 集群中的名称
    node.name: master  # 该节点名称
    node.master: true  # 意思是该节点为主节点
    node.data: false  # 表示这不是数据节点
    network.host: 0.0.0.0  # 监听全部ip,在实际环境中应设置为一个安全的ip
    http.port: 9200  # es服务的端口号
    discovery.zen.ping.unicast.hosts: ["192.168.77.128", "192.168.77.130", "192.168.77.134"] # 配置自动发现
    [root@master-node ~]#
    然后将配置文件发送到另外两台机器上去:

    [root@master-node ~]# scp /etc/elasticsearch/elasticsearch.yml data-node1:/tmp/
    [root@master-node ~]# scp /etc/elasticsearch/elasticsearch.yml data-node2:/tmp/
    到两台机器上去更改该文件,修改以下几处地方:

    192.168.77.130:

    [root@data-node1 ~]# vim /tmp/elasticsearch.yml
    node.name: data-node1
    node.master: false
    node.data: true
    [root@data-node1 ~]# cp /tmp/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml
    cp: overwrite ‘/etc/elasticsearch/elasticsearch.yml’? yes
    [root@data-node1 ~]#
    192.168.77.134:

    [root@data-node2 ~]# vim /tmp/elasticsearch.yml
    node.name: data-node2
    node.master: false
    node.data: true
    [root@data-node2 ~]# cp /tmp/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml
    cp: overwrite ‘/etc/elasticsearch/elasticsearch.yml’? yes
    [root@data-node2 ~]#
    完成以上的配置之后,到主节点上,启动es服务:

    systemctl start elasticsearch.service

    主节点启动完成之后,再启动其他节点的es服务。

    排错记录:

    我这里启动主节点的时候没有启动成功,于是查看es的日志,但是却并没有生成,那就只能去看系统日志了:

    [root@master-node ~]# ls /var/log/elasticsearch/
    [root@master-node ~]# tail -n50 /var/log/messages
    错误日志如下:
    搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群

    如图,可以看到是JDK的路径配置得不对,没法在PATH里找到相应的目录。

    于是查看JAVA_HOME环境变量的值指向哪里:

    [root@master-node ~]# echo $JAVA_HOME
    /usr/local/jdk1.8/
    [root@master-node ~]# ls /usr/local/jdk1.8/
    bin        db       javafx-src.zip  lib      man          release  THIRDPARTYLICENSEREADME-JAVAFX.txt
    COPYRIGHT  include  jre             LICENSE  README.html  src.zip  THIRDPARTYLICENSEREADME.txt
    [root@master-node ~]#
    发现指向的路径并没有错,那就可能是忘记在profile里写export了,于是在profile的末尾加上了这一句:

    export JAVA_HOME JAVA_BIN JRE_HOME PATH CLASSPATH
    使用source命令重新加载了profile之后,重新启动es服务,但是依旧启动不起来,于是我发现我忽略了一条错误日志:
    搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群

    这是无法在环境变量中找到java可执行文件,那就好办了,做一个软链接过去即可:

    [root@master-node ~]# ln -s /usr/local/jdk1.8/bin/java /usr/bin/
    再次启动es服务,这次就终于启动成功了:

    [root@master-node ~]# systemctl restart elasticsearch.service
    [root@master-node ~]# ps aux |grep elasticsearch
    elastic+   2655  9.4 31.8 3621592 1231396 ?     Ssl  15:42   0:14 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.io.tmpdir=/tmp/elasticsearch.4M9NarAc -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/lib/elasticsearch -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:/var/log/elasticsearch/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/etc/elasticsearch -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid --quiet
    root       2735  0.0  0.0 112660   968 pts/0    S+   15:44   0:00 grep --color=auto elasticsearch
    [root@master-node ~]# netstat -lntp |grep java  # es服务会监听两个端口
    tcp6       0      0 :::9200                 :::*                    LISTEN      2655/java
    tcp6       0      0 :::9300                 :::*                    LISTEN      2655/java
    [root@master-node ~]#
    9300端口是集群通信用的,9200则是数据传输时用的。

    主节点启动成功后,依次启动其他节点即可,我这里其他节点都是启动正常的。

    curl查看es集群情况
    集群的健康检查:

    [root@master-node ~]# curl '192.168.77.128:9200/_cluster/health?pretty'
    {
    "cluster_name" : "master-node",
    "status" : "green",  # 为green则代表健康没问题,如果是yellow或者red则是集群有问题
    "timed_out" : false,  # 是否有超时
    "number_of_nodes" : 3, # 集群中的节点数量
    "number_of_data_nodes" : 2, # 集群中data节点的数量
    "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
    }
    [root@master-node ~]#
    查看集群的详细信息:

    [root@master-node ~]# curl '192.168.77.128:9200/_cluster/state?pretty'
    {
    "cluster_name" : "master-node",
    "compressed_size_in_bytes" : 354,
    "version" : 4,
    "state_uuid" : "QkECzZHVQJOXB7K_9CgXYQ",
    "master_node" : "SGez5oKUTa2eIijLp8MsLQ",
    "blocks" : { },
    "nodes" : {
    "4sJURH6cTsykgLberJ6pVw" : {
    "name" : "data-node1",
    "ephemeral_id" : "t16_uw92T5ajJqp2HWodrg",
    "transport_address" : "192.168.56.128:9300",
    "attributes" : { }
    },
    "SGez5oKUTa2eIijLp8MsLQ" : {
    "name" : "master",
    "ephemeral_id" : "eJZX20tpSNyJCHgBIC4x4Q",
    "transport_address" : "192.168.77.128:9300",
    "attributes" : { }
    },
    "nZ4L5-KwSdirnluhJTGn7Q" : {
    "name" : "data-node2",
    "ephemeral_id" : "pQENcoUcRY6fTs7SamX2KQ",
    "transport_address" : "192.168.77.134:9300",
    "attributes" : { }
    }
    },
    "metadata" : {
    "cluster_uuid" : "jZPv-awrQDe163Nu3y2hHw",
    "templates" : { },
    "indices" : { },
    "index-graveyard" : {
    "tombstones" : [ ]
    }
    },
    "routing_table" : {
    "indices" : { }
    },
    "routing_nodes" : {
    "unassigned" : [ ],
    "nodes" : {
    "nZ4L5-KwSdirnluhJTGn7Q" : [ ],
    "4sJURH6cTsykgLberJ6pVw" : [ ]
    }
    },
    "restore" : {
    "snapshots" : [ ]
    },
    "snapshot_deletions" : {
    "snapshot_deletions" : [ ]
    },
    "snapshots" : {
    "snapshots" : [ ]
    }
    }
    [root@master-node ~]#
    检查没有问题后,我们的es集群就搭建完成了,很简单。

    这个集群的状态信息也可以通过浏览器查看:
    搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群

    但是显示出来的也是一堆字符串,我们希望这些信息能以图形化的方式显示出来,那就需要安装kibana来为我们展示这些数据了。

    更多使用curl命令操作elasticsearch的内容,可参考以下文章:

    http://zhaoyanblog.com/archives/732.html


    https://blog.51cto.com/zero01/2082794

    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器

    内容:搭建ELK日志分析平台——搭建kibana和logstash服务器

    6 安装kibana
    7 安装logstash
    8 配置logstash
    9 kibana上查看日志
    10 收集nginx日志
    11 使用beats采集日志


    安装kibana
    由于上一篇中我们已经配置过yum源,这里就不用再配置了,直接yum安装即可,安装命令如下,在主节点上安装:

    [root@master-node ~]# yum -y install kibana
    若yum安装的速度太慢,可以直接下载rpm包来进行安装:

    [root@master-node ~]# wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.0-x86_64.rpm

    [root@master-node ~]# rpm -ivh kibana-6.0.0-x86_64.rpm


    安装完成后,对kibana进行配置:

    [root@master-node ~]# vim /etc/kibana/kibana.yml  # 增加以下内容
    server.port: 5601  # 配置kibana的端口
    server.host: 192.168.77.128  # 配置监听ip
    elasticsearch.url: "http://192.168.77.128:9200"  # 配置es服务器的ip,如果是集群则配置该集群中主节点的ip
    logging.dest: /var/log/kibana.log  # 配置kibana的日志文件路径,不然默认是messages里记录日志


    创建日志文件:

    touch /var/log/kibana.log

    chmod 777 /var/log/kibana.log

    启动kibana服务,并检查进程和监听端口:


    [root@master-node ~]# systemctl start kibana
    [root@master-node ~]# ps aux |grep kibana
    kibana     3083 36.8  2.9 1118668 112352 ?      Ssl  17:14   0:03 /usr/share/kibana/bin/../node/bin/node --no-warnings /usr/share/kibana/bin/../src/cli -c /etc/kibana/kibana.yml
    root       3095  0.0  0.0 112660   964 pts/0    S+   17:14   0:00 grep --color=auto kibana
    [root@master-node ~]# netstat -lntp |grep 5601
    tcp        0      0 192.168.77.128:5601     0.0.0.0:*               LISTEN      3083/node
    [root@master-node ~]#
    注:由于kibana是使用node.js开发的,所以进程名称为node
    然后在浏览器里进行访问,如:http://192.168.77.128:5601/ ,由于我们并没有安装x-pack,所以此时是没有用户名和密码的,可以直接访问的:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    到此我们的kibana就安装完成了,很简单,接下来就是安装logstash,不然kibana是没法用的。
    安装logstash
    在192.168.77.130上安装logstash,但是要注意的是目前logstash不支持JDK1.9。
    直接yum安装,安装命令如下:
    [root@data-node1 ~]# yum install -y  logstash
    如果yum源的速度太慢的话就下载rpm包来进行安装:
    [root@data-node1 ~]# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.rpm
    [root@data-node1 ~]# rpm -ivh logstash-6.0.0.rpm
    安装完之后,先不要启动服务,先配置logstash收集syslog日志:
    [root@data-node1 ~]# 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
    Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
    Configuration OK  # 为ok则代表配置文件没有问题
    [root@data-node1 /usr/share/logstash/bin]#
    命令说明:
    --path.settings 用于指定logstash的配置文件所在的目录
    -f 指定需要被检测的配置文件的路径
    --config.test_and_exit 指定检测完之后就退出,不然就会直接启动了
    配置kibana服务器的ip以及配置的监听端口:
    [root@data-node1 ~]# vim /etc/rsyslog.conf
    #### RULES ####
    *.* @@192.168.77.130: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
    Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
    # 这时终端会停留在这里,因为我们在配置文件中定义的是将信息输出到当前终端
    打开新终端检查一下10514端口是否已被监听:
    [root@data-node1 ~]# netstat -lntp |grep 10514
    tcp6       0      0 :::10514                :::*                    LISTEN      4312/java
    [root@data-node1 ~]#
    然后在别的机器ssh登录到这台机器上,测试一下有没有日志输出:
    [root@data-node1 /usr/share/logstash/bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf
    Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
    {
    "severity" => 6,
    "pid" => "4575",
    "program" => "sshd",
    "message" => "Accepted password for root from 192.168.77.128 port 58336 ssh2\n",
    "type" => "system-syslog",
    "priority" => 86,
    "logsource" => "data-node1",
    "@timestamp" => 2018-03-03T18:12:27.000Z,
    "@version" => "1",
    "host" => "192.168.77.130",
    "facility" => 10,
    "severity_label" => "Informational",
    "timestamp" => "Mar  4 02:12:27",
    "facility_label" => "security/authorization"
    }
    {
    "severity" => 6,
    "program" => "systemd",
    "message" => "Started Session 42 of user root.\n",
    "type" => "system-syslog",
    "priority" => 30,
    "logsource" => "data-node1",
    "@timestamp" => 2018-03-03T18:12:27.000Z,
    "@version" => "1",
    "host" => "192.168.77.130",
    "facility" => 3,
    "severity_label" => "Informational",
    "timestamp" => "Mar  4 02:12:27",
    "facility_label" => "system"
    }
    {
    "severity" => 6,
    "program" => "systemd-logind",
    "message" => "New session 42 of user root.\n",
    "type" => "system-syslog",
    "priority" => 38,
    "logsource" => "data-node1",
    "@timestamp" => 2018-03-03T18:12:27.000Z,
    "@version" => "1",
    "host" => "192.168.77.130",
    "facility" => 4,
    "severity_label" => "Informational",
    "timestamp" => "Mar  4 02:12:27",
    "facility_label" => "security/authorization"
    }
    {
    "severity" => 6,
    "pid" => "4575",
    "program" => "sshd",
    "message" => "pam_unix(sshd:session): session opened for user root by (uid=0)\n",
    "type" => "system-syslog",
    "priority" => 86,
    "logsource" => "data-node1",
    "@timestamp" => 2018-03-03T18:12:27.000Z,
    "@version" => "1",
    "host" => "192.168.77.130",
    "facility" => 10,
    "severity_label" => "Informational",
    "timestamp" => "Mar  4 02:12:27",
    "facility_label" => "security/authorization"
    }
    {
    "severity" => 6,
    "program" => "systemd",
    "message" => "Starting Session 42 of user root.\n",
    "type" => "system-syslog",
    "priority" => 30,
    "logsource" => "data-node1",
    "@timestamp" => 2018-03-03T18:12:27.000Z,
    "@version" => "1",
    "host" => "192.168.77.130",
    "facility" => 3,
    "severity_label" => "Informational",
    "timestamp" => "Mar  4 02:12:27",
    "facility_label" => "system"
    }
    {
    "severity" => 6,
    "pid" => "4575",
    "program" => "sshd",
    "message" => "Received disconnect from 192.168.77.128: 11: disconnected by user\n",
    "type" => "system-syslog",
    "priority" => 86,
    "logsource" => "data-node1",
    "@timestamp" => 2018-03-03T18:12:35.000Z,
    "@version" => "1",
    "host" => "192.168.77.130",
    "facility" => 10,
    "severity_label" => "Informational",
    "timestamp" => "Mar  4 02:12:35",
    "facility_label" => "security/authorization"
    }
    {
    "severity" => 6,
    "pid" => "4575",
    "program" => "sshd",
    "message" => "pam_unix(sshd:session): session closed for user root\n",
    "type" => "system-syslog",
    "priority" => 86,
    "logsource" => "data-node1",
    "@timestamp" => 2018-03-03T18:12:35.000Z,
    "@version" => "1",
    "host" => "192.168.77.130",
    "facility" => 10,
    "severity_label" => "Informational",
    "timestamp" => "Mar  4 02:12:35",
    "facility_label" => "security/authorization"
    }
    {
    "severity" => 6,
    "program" => "systemd-logind",
    "message" => "Removed session 42.\n",
    "type" => "system-syslog",
    "priority" => 38,
    "logsource" => "data-node1",
    "@timestamp" => 2018-03-03T18:12:35.000Z,
    "@version" => "1",
    "host" => "192.168.77.130",
    "facility" => 4,
    "severity_label" => "Informational",
    "timestamp" => "Mar  4 02:12:35",
    "facility_label" => "security/authorization"
    }
    如上,可以看到,终端中以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.77.128: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
    Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
    Configuration OK
    [root@data-node1 /usr/share/logstash/bin]#
    没问题后,启动logstash服务,并检查进程以及监听端口:
    [root@data-node1 ~]# systemctl start logstash
    [root@data-node1 ~]# ps aux |grep logstash
    logstash   5364  285 20.1 3757012 376260 ?      SNsl 04:36   0:34 /bin/java -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+DisableExplicitGC -Djava.awt.headless=true -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -Xmx1g -Xms256m -Xss2048k -Djffi.boot.library.path=/usr/share/logstash/vendor/jruby/lib/jni -Xbootclasspath/a:/usr/share/logstash/vendor/jruby/lib/jruby.jar -classpath : -Djruby.home=/usr/share/logstash/vendor/jruby -Djruby.lib=/usr/share/logstash/vendor/jruby/lib -Djruby.script=jruby -Djruby.shell=/bin/sh org.jruby.Main /usr/share/logstash/lib/bootstrap/environment.rb logstas/runner.rb --path.settings /etc/logstash
    root       5400  0.0  0.0 112652   964 pts/0    S+   04:36   0:00 grep --color=auto logstash
    错误解决:
    我这里启动logstash后,进程是正常存在的,但是9600以及10514端口却没有被监听。于是查看logstash的日志看看有没有错误信息的输出,但是发现没有记录日志信息,那就只能转而去查看messages的日志,发现错误信息如下:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    这是因为权限不够,既然是权限不够,那就设置权限即可:
    [root@data-node1 ~]# chown logstash /var/log/logstash/logstash-plain.log
    [root@data-node1 ~]# ll !$
    ll /var/log/logstash/logstash-plain.log
    -rw-r--r-- 1 logstash root 7597 Mar  4 04:35 /var/log/logstash/logstash-plain.log
    [root@data-node1 ~]# systemctl restart logstash
    设置完权限重启服务之后,发现还是没有监听端口,查看logstash-plain.log文件记录的错误日志信息如下:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    可以看到,依旧是权限的问题,这是因为之前我们以root的身份在终端启动过logstash,所以产生的相关文件的属组属主都是root,同样的,也是设置一下权限即可:
    [root@data-node1 ~]# ll /var/lib/logstash/
    total 4
    drwxr-xr-x 2 root root  6 Mar  4 01:50 dead_letter_queue
    drwxr-xr-x 2 root root  6 Mar  4 01:50 queue
    -rw-r--r-- 1 root root 36 Mar  4 01:58 uuid
    [root@data-node1 ~]# chown -R logstash /var/lib/logstash/
    [root@data-node1 ~]# systemctl restart logstash
    这次就没问题了,端口正常监听了,这样我们的logstash服务就启动成功了:
    [root@data-node1 ~]# netstat -lntp |grep 9600
    tcp6       0      0 127.0.0.1:9600          :::*                    LISTEN      9905/java
    [root@data-node1 ~]# netstat -lntp |grep 10514
    tcp6       0      0 :::10514                :::*                    LISTEN      9905/java
    [root@data-node1 ~]#
    但是可以看到,logstash的监听ip是127.0.0.1这个本地ip,本地ip无法远程通信,所以需要修改一下配置文件,配置一下监听的ip:
    [root@data-node1 ~]# vim /etc/logstash/logstash.yml
    http.host: "192.168.77.130"
    [root@data-node1 ~]# systemctl restart logstash
    [root@data-node1 ~]# netstat -lntp |grep 9600
    tcp6       0      0 192.168.77.130:9600     :::*                    LISTEN      10091/java
    [root@data-node1 ~]#
    kibana上查看日志
    完成了logstash服务器的搭建之后,回到kibana服务器上查看日志,执行以下命令可以获取索引信息:
    [root@master-node ~]# curl '192.168.77.128:9200/_cat/indices?v'
    health status index                 uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    green  open   .kibana               6JfXc0gFSPOWq9gJI1ZX2g   1   1          1            0      6.9kb          3.4kb
    green  open   system-syslog-2018.03 bUXmEDskTh6fjGD3JgyHcA   5   1         61            0    591.7kb        296.7kb
    [root@master-node ~]#
    如上,可以看到,在logstash配置文件中定义的system-syslog索引成功获取到了,证明配置没问题,logstash与es通信正常。
    获取指定索引详细信息:
    [root@master-node ~]# curl -XGET '192.168.77.128:9200/system-syslog-2018.03?pretty'
    {
    "system-syslog-2018.03" : {
    "aliases" : { },
    "mappings" : {
    "system-syslog" : {
    "properties" : {
    "@timestamp" : {
    "type" : "date"
    },
    "@version" : {
    "type" : "text",
    "fields" : {
    "keyword" : {
    "type" : "keyword",
    "ignore_above" : 256
    }
    }
    },
    "facility" : {
    "type" : "long"
    },
    "facility_label" : {
    "type" : "text",
    "fields" : {
    "keyword" : {
    "type" : "keyword",
    "ignore_above" : 256
    }
    }
    },
    "host" : {
    "type" : "text",
    "fields" : {
    "keyword" : {
    "type" : "keyword",
    "ignore_above" : 256
    }
    }
    },
    "logsource" : {
    "type" : "text",
    "fields" : {
    "keyword" : {
    "type" : "keyword",
    "ignore_above" : 256
    }
    }
    },
    "message" : {
    "type" : "text",
    "fields" : {
    "keyword" : {
    "type" : "keyword",
    "ignore_above" : 256
    }
    }
    },
    "pid" : {
    "type" : "text",
    "fields" : {
    "keyword" : {
    "type" : "keyword",
    "ignore_above" : 256
    }
    }
    },
    "priority" : {
    "type" : "long"
    },
    "program" : {
    "type" : "text",
    "fields" : {
    "keyword" : {
    "type" : "keyword",
    "ignore_above" : 256
    }
    }
    },
    "severity" : {
    "type" : "long"
    },
    "severity_label" : {
    "type" : "text",
    "fields" : {
    "keyword" : {
    "type" : "keyword",
    "ignore_above" : 256
    }
    }
    },
    "timestamp" : {
    "type" : "text",
    "fields" : {
    "keyword" : {
    "type" : "keyword",
    "ignore_above" : 256
    }
    }
    },
    "type" : {
    "type" : "text",
    "fields" : {
    "keyword" : {
    "type" : "keyword",
    "ignore_above" : 256
    }
    }
    }
    }
    }
    },
    "settings" : {
    "index" : {
    "creation_date" : "1520082481446",
    "number_of_shards" : "5",
    "number_of_replicas" : "1",
    "uuid" : "bUXmEDskTh6fjGD3JgyHcA",
    "version" : {
    "created" : "6020299"
    },
    "provided_name" : "system-syslog-2018.03"
    }
    }
    }
    }
    [root@master-node ~]#
    如果日后需要删除索引的话,使用以下命令可以删除指定索引:
    curl -XDELETE 'localhost:9200/system-syslog-2018.03'
    es与logstash能够正常通信后就可以去配置kibana了,浏览器访问192.168.77.128:5601,到kibana页面上配置索引:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    我们也可以使用通配符,进行批量匹配:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    配置成功后点击 “Discover” :
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    进入 “Discover” 页面后如果出现以下提示,则是代表无法查找到日志信息:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    这种情况一般是时间的问题,点击右上角切换成查看当天的日志信息:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    这时应该就能够正常查看了:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    如果还是不行的话,就换几个时间试试,换了几个时间都不行的话,就在浏览器中直接访问es服务器看看是否有反馈出信息:
    http://192.168.77.128:9200/system-syslog-2018.03/_search?q=*
    如下,这是正常返回信息的情况,如果有问题的话是会返回error的:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    如果es服务器正常返回信息,但是 “Discover” 页面却依旧显示无法查找到日志信息的话,就使用另一种方式,进入设置删除掉索引:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    重新添加索引,但是这次不要选择 @timestampe 了:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    但是这种方式只能看到数据,没有可视化的柱状图:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    其实这里显示的日志数据就是 /var/log/messages 文件里的数据,因为logstash里配置的就是收集messages 文件里的数据。
    以上这就是如何使用logstash收集系统日志,输出到es服务器上,并在kibana的页面上进行查看。
    27.10 logstash收集nginx日志
    和收集syslog一样,首先需要编辑配置文件,这一步在logstash服务器上完成:
    [root@data-node1 ~]# vim /etc/logstash/conf.d/nginx.conf  # 增加如下内容
    input {
    file {  # 指定一个文件作为输入源
    path => "/tmp/elk_access.log"  # 指定文件的路径
    start_position => "beginning"  # 指定何时开始收集
    type => "nginx"  # 定义日志类型,可自定义
    }
    }
    filter {  # 配置过滤器
    grok {
    match => { "message" => "%{IPORHOST:http_host} %{IPORHOST:clientip} - %{USERNAME:remote_user} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:http_verb} %{NOTSPACE:http_request}(?: HTTP/%{NUMBER:http_version})?|%{DATA:raw_http_request})\" %{NUMBER:response} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent} %{QS:xforwardedfor} %{NUMBER:request_time:float}"}  # 定义日志的输出格式
    }
    geoip {
    source => "clientip"
    }
    }
    output {
    stdout { codec => rubydebug }
    elasticsearch {
    hosts => ["192.168.77.128:9200"]
    index => "nginx-test-%{+YYYY.MM.dd}"
    }
    }
    同样的编辑完配置文件之后,还需要检测配置文件是否有错:
    [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/nginx.conf --config.test_and_exit
    Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties
    Configuration OK
    [root@data-node1 /usr/share/logstash/bin]#
    检查完毕之后,进入你的nginx虚拟主机配置文件所在的目录中,新建一个虚拟主机配置文件:
    [root@data-node1 ~]# cd /usr/local/nginx/conf/vhost/
    [root@data-node1 /usr/local/nginx/conf/vhost]# vim elk.conf
    server {
    listen 80;
    server_name elk.test.com;
    location / {
    proxy_pass      http://192.168.77.128:5601;
    proxy_set_header Host   $host;
    proxy_set_header X-Real-IP      $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    access_log  /tmp/elk_access.log main2;
    }
    配置nginx的主配置文件,因为需要配置日志格式,在 log_format combined_realip 那一行的下面增加以下内容:
    [root@data-node1 ~]# vim /usr/local/nginx/conf/nginx.conf
    log_format main2 '$http_host $remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$upstream_addr" $request_time';
    完成以上配置文件的编辑之后,检测配置文件有没有错误,没有的话就reload重新加载:
    [root@data-node1 ~]# /usr/local/nginx/sbin/nginx -t
    nginx: [warn] conflicting server name "aaa.com" on 0.0.0.0:80, ignored
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    [root@data-node1 ~]# /usr/local/nginx/sbin/nginx -s reload
    [root@data-node1 ~]#
    由于我们需要在windows下通过浏览器访问我们配置的 elk.test.com 这个域名,所以需要在windows下编辑它的hosts文件增加以下内容:
    192.168.77.130 elk.test.com
    这时在浏览器上就可以通过这个域名进行访问了:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    访问成功后,查看生成的日志文件:
    [root@data-node1 ~]# ls /tmp/elk_access.log
    /tmp/elk_access.log
    [root@data-node1 ~]# wc -l !$
    wc -l /tmp/elk_access.log
    45 /tmp/elk_access.log
    [root@data-node1 ~]#
    如上,可以看到,nginx的访问日志已经生成了。
    重启logstash服务,生成日志的索引:
    systemctl restart logstash
    重启完成后,在es服务器上检查是否有nginx-test开头的索引生成:
    [root@master-node ~]# curl '192.168.77.128:9200/_cat/indices?v'
    health status index                 uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    green  open   .kibana               6JfXc0gFSPOWq9gJI1ZX2g   1   1          2            0     14.4kb          7.2kb
    green  open   system-syslog-2018.03 bUXmEDskTh6fjGD3JgyHcA   5   1        902            0      1.1mb        608.9kb
    green  open   nginx-test-2018.03.04 GdKYa6gBRke7mNgrh2PBUA   5   1         45            0      199kb         99.5kb
    [root@master-node ~]#
    可以看到,nginx-test索引已经生成了,那么这时就可以到kibana上配置该索引:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    配置完成之后就可以在 “Discover” 里进行查看nginx的访问日志数据了:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    使用beats采集日志
    之前也介绍过beats是ELK体系中新增的一个工具,它属于一个轻量的日志采集器,以上我们使用的日志采集工具是logstash,但是logstash占用的资源比较大,没有beats轻量,所以官方也推荐使用beats来作为日志采集工具。而且beats可扩展,支持自定义构建。
    官方介绍:
    https://www.elastic.co/cn/products/beats
    在 192.168.77.134 上安装filebeat,filebeat是beats体系中用于收集日志信息的工具:
    [root@data-node2 ~]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.0.0-x86_64.rpm
    [root@data-node2 ~]# rpm -ivh  filebeat-6.0.0-x86_64.rpm
    安装完成之后编辑配置文件:
    [root@data-node2 ~]# vim /etc/filebeat/filebeat.yml  # 增加或者更改为以下内容
    filebeat.prospectors:
    - type: log
    #enabled: false 这一句要注释掉
    paths:
    - /var/log/messages  # 指定需要收集的日志文件的路径
    #output.elasticsearch:  # 先将这几句注释掉
    # Array of hosts to connect to.
    #  hosts: ["localhost:9200"]
    output.console:  # 指定在终端上输出日志信息
    enable: true
    配置完成之后,执行以下命令,看看是否有在终端中打印日志数据,有打印则代表filebeat能够正常收集日志数据:
    [root@data-node2 ~]# /usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml
    以上的配置只是为了测试filebeat能否正常收集日志数据,接下来我们需要再次修改配置文件,将filebeat作为一个服务启动:
    [root@data-node2 ~]# vim /etc/filebeat/filebeat.yml
    #output.console:  把这两句注释掉
    #  enable: true
    # 把这两句的注释去掉
    output.elasticsearch:
    # Array of hosts to connect to.
    hosts: ["192.168.77.128:9200"]  # 并配置es服务器的ip地址
    修改完成后就可以启动filebeat服务了:
    [root@data-node2 ~]# systemctl start filebeat
    [root@data-node2 ~]# ps axu |grep filebeat
    root       3021  0.3  2.3 296360 11288 ?        Ssl  22:27   0:00 /usr/share/filebeat/bin/filebeat -c /etc/filebeat/filebeat.yml -path.home /usr/share/filebeat -path.config /etc/filebeat -path.data /var/lib/filebeat -path.logs /var/log/filebeat
    root       3030  0.0  0.1 112660   960 pts/0    S+   22:27   0:00 grep --color=auto filebeat
    启动成功后,到es服务器上查看索引,可以看到新增了一个以filebeat-6.0.0开头的索引,这就代表filesbeat和es能够正常通信了:
    [root@master-node ~]# curl '192.168.77.128:9200/_cat/indices?v'
    health status index                     uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    green  open   system-syslog-2018.03     bUXmEDskTh6fjGD3JgyHcA   5   1      73076            0     24.8mb         11.6mb
    green  open   nginx-test-2018.03.04     GdKYa6gBRke7mNgrh2PBUA   5   1         91            0        1mb        544.8kb
    green  open   .kibana                   6JfXc0gFSPOWq9gJI1ZX2g   1   1          3            0     26.9kb         13.4kb
    green  open   filebeat-6.0.0-2018.03.04 MqQJMUNHS_OiVmO26NEWTw   3   1         66            0     64.5kb         39.1kb
    [root@master-node ~]#
    es服务器能够正常获取到索引后,就可以到kibana上配置这个索引了:
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
    以上这就是如何使用filebeat进行日志的数据收集,可以看到配置起来比logstash要简单,而且占用资源还少。
    扩展部分
    集中式日志分析平台 - ELK Stack - 安全解决方案 X-Pack:
    http://www.jianshu.com/p/a49d93212eca
    https://www.elastic.co/subscriptions
    Elastic stack演进:
    http://70data.net/1505.html
    基于kafka和elasticsearch,linkedin构建实时日志分析系统:
    http://t.cn/RYffDoE
    elastic stack 使用redis作为日志缓冲:
    http://blog.lishiming.net/?p=463
    ELK+Filebeat+Kafka+ZooKeeper 构建海量日志分析平台:
    https://www.cnblogs.com/delgyd/p/elk.html
    关于elk+zookeeper+kafka 运维集中日志管理:

    https://www.jianshu.com/p/d65aed756587



    来自:PC 广东省广州市
    上一篇: Centos7单机部署ELK
    您可能还喜欢这些:

    1 1条评论

    评论审核已开启 记住我的个人信息 回复后邮件通知我
    Back to Top