用Docker快速搭建ELK日志收集系统

 提示:转载请注明原文链接

 本文链接:https://360us.net/article/60.html

我这里说的日志是应用日志,比如Web api 出现的一些异常,错误信息等,收集到一起,方便查询检索。

基本架构是,应用把出现的异常错误信息发送到MQ,再存储到数据库,然后提供一个web前端可以查看和检索。

ELK的主要组件如下:

  • elasticsearch:存储数据的地方
  • kibana:可视化数据的web前端
  • logstash:数据中转的地方,可以收集数据,过滤转换之后存储起来,输入和输出都可配置,默认是elasticsearch,也可以是其他数据库。
  • beats:这个是收集特定数据的一组轻量级工具,可以单独安装用来收集特定数据,比如nginx的日志,系统日志,或者是系统监控信息等,这组工具的信息可以直接写入到elasticsearch,也可以通过logstash写入。和上面三个工具集成度很高,只需要很少的配置就可以完成收集安装。

这里我只是收集应用日志,所以暂时不需要用到beats

数据流向图:

流向图

这里我用docker搭建。

docker-compose.yml文件内容如下:

version: '3'

#doc https://www.elastic.co/guide/en/elastic-stack/current/installing-elastic-stack.html
#doc https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-docker.html
#doc https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-docker.html
#images https://www.docker.elastic.co/
services:
    elasticsearch:
        image: docker.elastic.co/elasticsearch/elasticsearch:6.4.2
        container_name: elasticsearch
        #environment:
            #- cluster.name=docker-cluster
            #- bootstrap.memory_lock=true
            #- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ports:
            - "9200:9200" #http请求端口
            - "9300:9300" #节点间通信端口
        ulimits:
            memlock:
                soft: -1
                hard: -1
        volumes:
            - "./etc/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml"
            #- "./data/esdata:/usr/share/elasticsearch/data"
    ############################################
    kibana:
        image: docker.elastic.co/kibana/kibana:6.4.2
        container_name: kibana
        volumes:
            - "./etc/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml"
        #environment:
            #SERVER_NAME: kibana.example.org
            #ELASTICSEARCH_URL: http://elasticsearch.example.org
        ports:
            - 5601:5601 #http请求端口
    ##############################################
    logstash:
        image: docker.elastic.co/logstash/logstash:6.4.2
        container_name: logstash
        ports:
            - 5044:5044
            - 9600:9600 #获取监控信息的端口
            - 8080:8080 #port for http input plugin
        volumes:
            - ./etc/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml
            - ./etc/logstash/pipelines.yml:/usr/share/logstash/config/pipelines.yml
            - ./etc/logstash/conf.d:/usr/share/logstash/config/conf.d

    ############################################
    rabbitmq:
        image: rabbitmq:3-management
        container_name: rabbitmq
        ports:
            - 5672:5672
            - 15672:15672
        volumes:
            - ./etc/rabbitmq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf

logstash分别启用RabbitMQhttp 输入插件,分别演示通过MQ传数据给logstash和直接通过http方式推数据给logstash

logstashpipeline配置如下:

#demo-http-pipeline.conf
input {
  http {
    additional_codecs => {"application/json"=>"json"}
    port => 8080
    threads => 2
  }
}

# The filter part of this file is commented out to indicate that it
# is optional.
# filter {
#
# }

output {
  elasticsearch {
    hosts => "elasticsearch:9200"
    manage_template => false
    index => "http-log-test-%{+YYYY.MM.dd}"
  }
}
#demo-rabbitmq-pipeline.conf
input {
  rabbitmq {
    host => "rabbitmq"
    subscription_retry_interval_seconds => 5
    queue => "hello"   #监听队列
  }
}

# The filter part of this file is commented out to indicate that it
# is optional.
# filter {
#
# }

output {
  elasticsearch {
    hosts => "elasticsearch:9200"
    manage_template => false
    index => "rabbitmq-log-test-%{+YYYY.MM.dd}"
  }
}

运行docker-compose up -d,正常运行起来之后可以访问ip:5601打开kibana,访问ip:15672可以打开RabbitMQ的web管理页面。

ELK几大组件启动准备好需要一点时间,需要等待一会。

elasticsearch就绪的情况下,可以用curl访问curl http://localhost:9200,正常会返回一个json信息。

kibana就绪之后,通过浏览器访问5601端口就可以了。

logstash可以通过下面的http推送数据,返回ok说明已经可以用了。

下面是用两种输入插件分别推送数据到logstash

往mq写数据:

<?php
require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel(); //创建channel

//声明一个队列hello
$channel->queue_declare('hello', false, false, false, false);

//往队列里面推消息
$msg = new AMQPMessage('{"site":"a", "level":"error", "message": "unknow error", "trace":"sdfsfsf"}');
//往上面logstash配置的监听队列里面写数据就行了
$channel->basic_publish($msg, '', 'hello');

echo " [x] Sent 'Hello World!'\n";

//关闭channel和连接
$channel->close();
$connection->close();

通过http直接向logstash推数据:

curl -H "Content-Type:application/json" -X POST --data '{"site":"b","error":"a3423w42341232","trace":"asdsfdsf"}' http://localhost:8080

mq的是site a,http的是site b

打开kibana -> management -> elasticsearch -> index management,可以看到刚刚写入的数据: elasticsearch_index

management -> kibana -> index patterns,到里面创建一个索引匹配模式,这里我创建的是rabbitmq-log-*kinbana_index_patterns

然后就可以在Discover页面看到数据列表了: kinbana_discover

还可以在Discover里面,search查询数据,然后点击右上角的save,把查询保存起来,可以在Visualize里面用这个保存的查询创建一个可视化列表,方便查看特定数据。

ELK的几大组件非常容易安装,使用默认配置就可以直接运行起来。

最后附件是本文所有docker相关配置文件打包。

附件 访问密码:4e1fE36c62


本文链接:https://360us.net/article/60.html