我这里说的日志是应用日志,比如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
分别启用RabbitMQ
和http
输入插件,分别演示通过MQ传数据给logstash
和直接通过http
方式推数据给logstash
logstash
的pipeline
配置如下:
#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,可以看到刚刚写入的数据:
management -> kibana -> index patterns,到里面创建一个索引匹配模式,这里我创建的是rabbitmq-log-*
:
然后就可以在Discover
页面看到数据列表了:
还可以在Discover
里面,search
查询数据,然后点击右上角的save
,把查询保存起来,可以在Visualize
里面用这个保存的查询创建一个可视化列表,方便查看特定数据。
ELK的几大组件非常容易安装,使用默认配置就可以直接运行起来。
最后附件是本文所有docker相关配置文件打包。
附件 访问密码:4e1fE36c62
本文链接:https://360us.net/article/60.html