# ETK 日志平台
##背景介绍
`td-agent` 和 `elasticsearch`、`kibana` 搭建日志平台
![img](http://image.135editor.com/files/users/205/2052226/201711/hd2WyprE_bsyD.png)
### td-agent(fluentd)
```PHP
1、td-agent 和 fluentd 说的是一个东西, 是一种客户-服务端软件
2、fluentd 是一个日志收集系统,它的特点在于其各部分均是可定制化的,你可以通过简单的配置,将日志收集到不同的地方.
3、fluentd 是用C语言和Ruby结合编写的,只需很少的系统资源, 实例在30-40MB的内存上运行, 可以处理13,000个事件/秒/CPU; 由于其占用内存空间小(30〜40MB),可以大量节省内存
4、fluentd 尽可能将数据结构设计为JSON
5、fluentd在log shipper端的速度比logstash更优秀
6、5000多家数据驱动公司依靠Fluentd通过更好地使用和理解日志数据来区分他们的产品和服务
```
### elasticsearch
```PHP
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,可以很方便水平扩展机器来存储大量的数据。
```
### kibana
```PHP
Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。
A、Elasticsearch无缝之集成
Kibana架构为Elasticsearch定制,可以将任何结构化和非结构化数据加入Elasticsearch索引。Kibana还充分利用了Elasticsearch强大的搜索和分析功能。
B、整合你的数据
Kibana能够更好地处理海量数据,并据此创建柱形图、折线图、散点图、直方图、饼图和地图。
C、可视化多数据源
Kibana可以非常方便地把来自Logstash、ES-Hadoop、Beats或第三方技术的数据整合到Elasticsearch,支持的第三方技术包括Apache Flume、Fluentd等。
Kibana 的使用场景,应该集中在两方面:
1.实时监控**
通过 histogram 面板,配合不同条件的多个 queries 可以对一个事件走很多个维度组合出不同的时间序列走势。时间序列数据是最常见的监控报警了。
2.问题分析
通过 Kibana 的交互式界面可以很快的将异常时间或者事件范围缩小到秒级别或者个位数。期望一个完美的系统可以给你自动找到问题原因并且解决是不现实的,能够让你三两下就从TB级的数据里看到关键数据以便做出判断。
详细使用介绍:http://blog.csdn.net/ming_311/article/details/50619859
```
###总结使用
```PHP
fluentd:负责日志的收集,处理,索引
Elasticsearch:负责日志检索和分析和储存
Kibana:用于搜索和可视化的日志的Web界面,kibana使用node.js框架
```
```
【建议部署方式】
客户机a、b、c: 提供不同功能的微服务, 应用程序php monolog写日志 和 td-agent客户端
服务端机器: td-agent服务端(主备)
elasticsearch 集群
kibana 可视化
-------------------------------------------------------------------------------------------
【本教程部署方式】
基于Centos7搭建
两台机器A、B:
A机器: td-agent 服务端 , elasticsearch 和 kibana
B机器: td-agent 客户端 和 后台php monolog写日志
```
##安装A机器
### 安装td-agent服务端
```php
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
systemctl start td-agent 启动td-agent服务
systemctl status td-agent 查看status状态 出现active (running) 才是正常运行状态的
systemctl stop td-agent 停止td-agent服务
【安装完成后td-agent测试】
td-agent 启动后 默认监听8888端口,监听来自HTTP的请求,可以执行以下命令来测试:
curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
tailf /var/log/td-agent/td-agent.log
【服务机器配置】
vim /etc/td-agent/td-agent.conf
<match fluentd.**>
@type copy
<store>
@type elasticsearch
host 127.0.0.1 #es的服务器
port 9200
include_tag_key true
tag_key @log_name
logstash_format true #使用logstash格式索引
flush_interval 10s
</store>
</match>
【配置解析】
1、指定一logstash格式存储,主要为了方便使用kibana进行分析。
2、配置文件中需要增加timestamp。否则,kibana无法建立时序的索引,会影响查询速度。可以参考的参数
logstash_format true
logstash_prefix docker
logstash_dateformat %Y.%m.
3、match标签后面可以跟正则表达式以匹配我们指定的tag,只有匹配成功的tag对应的日志才会运用里面的配置。
4、flush_interval是用来控制多长时间将日志写入elasticsearch一次。
```
### 安装elasticsearch
```php
elasticsearch 是基于 java 开发的,所以需要先安装java 环境
yum list jdk
yum list installed|grep jdk
yum install java-1.8.0-openjdk.x86_64 -y
yum install -y elasticsearch-5.6.1.rpm
配置文件在/etc/elasticsearch/elasticsearch.yml
network.host: 0.0.0.0 #表示任意ip都可以访问
http.port: 9200
--------------------------------------------
elasticsearch会消耗大量资源,启动速度较慢
systemctl start elasticsearch
systemctl status elasticsearch
systemctl stop elasticsearch
--------------------------------------------
```
因为fluentd需要对elasticsearch支持,所以接下来我们需要安装fluentd的es插件。
(1)安装fluent-plugin-elasticsearch
```
/usr/sbin/td-agent-gem install fluent-plugin-elasticsearch
```
(2)安装fluentd type 插件
```
/usr/sbin/td-agent-gem install fluent-plugin-typecast
```
(3)安装secure-forward 插件(非必须但常用)
```
/usr/sbin/td-agent-gem install fluent-plugin-secure-forward
```
### 安装kibana
```php
cd /tmp
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.6.1-linux-x86_64.tar.gz
tar zxvf kibana-5.6.0-linux-x86_64.tar.gz
mv kibana-5.6.0-linux-x86_64/ /usr/local/kibana/
cd /usr/local/kibana/
./bin/kibana 启动kibana ctrl+c 关掉kibana ,如果需要成为后台进程 加上 &
配置文件修改:kibana/config/kibana.yml
server.host: "0.0.0.0"
server.port: 5601
创建完后
http://192.168.228.137:5601/app/kibana
```
### 小测试
post 测试下 fluentd与 elasticsearch kibana是否连通
```PHP
curl -X POST -d 'json={"123456":"awesome"}' "http://localhost:8888/test.tag.here"
```
多执行几次,等待日志flush 时间,然后看看kibana上有沒有出现
---------------------------------------------------
##安装B机器
### 安装td-agent客户端
```PHP
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
systemctl start td-agent 启动td-agent服务
systemctl status td-agent 查看status状态 出现active (running) 才是正常运行状态的
systemctl stop td-agent 停止td-agent服务
【安装完成后td-agent测试】
td-agent 启动后 默认监听8888端口,监听来自HTTP的请求,可以执行以下命令来测试:
curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
tailf /var/log/td-agent/td-agent.log
【待服务端td-agent配置好后,修改客户端配置】
vim /etc/td-agent/td-agent.conf
<source>
@type unix
path /var/run/td-agent/td-agent.sock
</source>
<match fluentd.**>
# @type stdout
type forward
flush_interval 60s
buffer_type file
buffer_path /var/log/td-agent/buffer/*
<server>
host 192.168.228.137 #远程的td-agent服务器
port 24224 #远程开启的端口
</server>
</match>
```
### 检测客户端与服务端
启动客户端td-agent ,任何时候kibana 出现数据没有及时显示, 查看 `/var/log/td-agent/td-agent.log`是否出现问题。
```PHP
#添加了远程服务端的节点#
adding forwarding server '192.168.228.137:24224' host="192.168.228.137" port=24224 weight=60 plugin_id="object:3fef9606b268"
#本地监听sock#
listening fluent socket on /var/run/td-agent/td-agent.sock
```
### 安装PHP monolog
```PHP
cd /data/
composer require monolog/monolog
touch /data/log.php
php log.php
```
```PHP
#log.php 内容#
<?php
require(__DIR__ . '/vendor/autoload.php');
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SocketHandler;
use Monolog\Formatter\FluentdFormatter;
//FluentLogger已经过去式,现在推荐使用monolog
$logger = new Logger('fluentd.tag');
$socketHandler = new SocketHandler('unix:///var/run/td-agent/td-agent.sock');
$socketHandler->setFormatter(new FluentdFormatter());//fluentd 格式才能写入
$socketHandler->setPersistent(true);
$logger->pushHandler($socketHandler,Logger::INFO);//DEBUG 及以上级别会写入
$tag_arr = array('kpcenter.blue','kpcenter.red');
for($i=0;$i<5;$i++){
$name = $tag_arr[mt_rand(0,1)];
$logger->error($name, json_decode('{"buyer_title":"\u6d77\u5357\u9ad8\u670b\u79d1\u6280\u6709\u9650\u516c\u53f8","buyer_title_type":2,"extra":"\u90d1\u5dde\u673a\u573a\u5e97 00117060608160028","buyer_taxcode":"91469027MA5RH09M0R","result_call_back":"http:\/\/allinvoice.zhouheiya.cn\/invoice-center\/blue-invoice-done","agent_name":"","buyer_address":"","buyer_bank_name":"\u4e2d\u56fd\u5de5\u5546\u94f6\u884c\u6f84\u8fc8\u8f6f\u4ef6\u56ed\u652f\u884c","buyer_bank_account":"2201080509100089564","buyer_phone":"","buyer_email":"","user_openid":"oF_Yo0fTF1SAjqnihqqFm7sXVezg","wx_union_id":"o1jrlwoortptNRurHGDRR7483fco","b_unique_id":"zbd_HBWHCS_00117060608160028","channel":"GP430000","buyer_bank_info":"\u4e2d\u56fd\u5de5\u5546\u94f6\u884c\u6f84\u8fc8\u8f6f\u4ef6\u56ed\u652f\u884c 2201080509100089564","sign_type":"RSA2","sell_id":"5","sell_name":"\u6e56\u5317\u4e16\u7eaa\u613f\u666f\u5546\u8d38\u6709\u9650\u516c\u53f8","sell_tax_code":"91420102669539796R","sell_bank_name_account":" ","sell_address_phone":"\u6b66\u6c49\u5e02\u6c5f\u5cb8\u533a\u80dc\u5229\u8857128-134\u53f7\u65b0\u6e90\u5927\u53a6307\u5ba4 18662202587","sell_bank_name":"","sell_address":"\u6b66\u6c49\u5e02\u6c5f\u5cb8\u533a\u80dc\u5229\u8857128-134\u53f7\u65b0\u6e90\u5927\u53a6307\u5ba4","sell_bank_account":null,"sell_phone":"18662202587","sell_drawer":"\u66fe\u4e16\u82b1","sell_payee":"\u80e1\u5706","sell_reviewer":"\u6c6a\u7131\u94f6","buyer_address_phone":" ","is_hide_detail":"0","goods_collect_name":"","goods_info":[{"name":"\u9e2d\u8116\u5b50","models":"","unit":"","total_price":"5.5","total":"1.000000","tax_code":"8888888888","tax_type":"halogen_product","tax_rate":"0.17","zero_tax_flag":"","c_total_price":"4.70","tax_amount":"0.80","has_tax":0,"fp_property":0,"per_price":"4.70000000","discount":-1,"discount_rate_value":"0.1818"}],"header_info":{"total_price":"4.70","fax_price":0.8,"fax_total_price":"5.5","goods_tax_type":"halogen_product","goods_tax_rate":"0.17"},"gp_unique_id":"20170920000000000515058746403098","invoice_state":1,"has_red":0,"is_red":0,"invoice_type":0,"app_id":"2017090759540391","buy_client_id":"2","relation_id":"28"}',true));
}
```
##背景介绍
`td-agent` 和 `elasticsearch`、`kibana` 搭建日志平台
![img](http://image.135editor.com/files/users/205/2052226/201711/hd2WyprE_bsyD.png)
### td-agent(fluentd)
```PHP
1、td-agent 和 fluentd 说的是一个东西, 是一种客户-服务端软件
2、fluentd 是一个日志收集系统,它的特点在于其各部分均是可定制化的,你可以通过简单的配置,将日志收集到不同的地方.
3、fluentd 是用C语言和Ruby结合编写的,只需很少的系统资源, 实例在30-40MB的内存上运行, 可以处理13,000个事件/秒/CPU; 由于其占用内存空间小(30〜40MB),可以大量节省内存
4、fluentd 尽可能将数据结构设计为JSON
5、fluentd在log shipper端的速度比logstash更优秀
6、5000多家数据驱动公司依靠Fluentd通过更好地使用和理解日志数据来区分他们的产品和服务
```
### elasticsearch
```PHP
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,可以很方便水平扩展机器来存储大量的数据。
```
### kibana
```PHP
Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。使用Kibana,可以通过各种图表进行高级数据分析及展示。
A、Elasticsearch无缝之集成
Kibana架构为Elasticsearch定制,可以将任何结构化和非结构化数据加入Elasticsearch索引。Kibana还充分利用了Elasticsearch强大的搜索和分析功能。
B、整合你的数据
Kibana能够更好地处理海量数据,并据此创建柱形图、折线图、散点图、直方图、饼图和地图。
C、可视化多数据源
Kibana可以非常方便地把来自Logstash、ES-Hadoop、Beats或第三方技术的数据整合到Elasticsearch,支持的第三方技术包括Apache Flume、Fluentd等。
Kibana 的使用场景,应该集中在两方面:
1.实时监控**
通过 histogram 面板,配合不同条件的多个 queries 可以对一个事件走很多个维度组合出不同的时间序列走势。时间序列数据是最常见的监控报警了。
2.问题分析
通过 Kibana 的交互式界面可以很快的将异常时间或者事件范围缩小到秒级别或者个位数。期望一个完美的系统可以给你自动找到问题原因并且解决是不现实的,能够让你三两下就从TB级的数据里看到关键数据以便做出判断。
详细使用介绍:http://blog.csdn.net/ming_311/article/details/50619859
```
###总结使用
```PHP
fluentd:负责日志的收集,处理,索引
Elasticsearch:负责日志检索和分析和储存
Kibana:用于搜索和可视化的日志的Web界面,kibana使用node.js框架
```
```
【建议部署方式】
客户机a、b、c: 提供不同功能的微服务, 应用程序php monolog写日志 和 td-agent客户端
服务端机器: td-agent服务端(主备)
elasticsearch 集群
kibana 可视化
-------------------------------------------------------------------------------------------
【本教程部署方式】
基于Centos7搭建
两台机器A、B:
A机器: td-agent 服务端 , elasticsearch 和 kibana
B机器: td-agent 客户端 和 后台php monolog写日志
```
##安装A机器
### 安装td-agent服务端
```php
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
systemctl start td-agent 启动td-agent服务
systemctl status td-agent 查看status状态 出现active (running) 才是正常运行状态的
systemctl stop td-agent 停止td-agent服务
【安装完成后td-agent测试】
td-agent 启动后 默认监听8888端口,监听来自HTTP的请求,可以执行以下命令来测试:
curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
tailf /var/log/td-agent/td-agent.log
【服务机器配置】
vim /etc/td-agent/td-agent.conf
<match fluentd.**>
@type copy
<store>
@type elasticsearch
host 127.0.0.1 #es的服务器
port 9200
include_tag_key true
tag_key @log_name
logstash_format true #使用logstash格式索引
flush_interval 10s
</store>
</match>
【配置解析】
1、指定一logstash格式存储,主要为了方便使用kibana进行分析。
2、配置文件中需要增加timestamp。否则,kibana无法建立时序的索引,会影响查询速度。可以参考的参数
logstash_format true
logstash_prefix docker
logstash_dateformat %Y.%m.
3、match标签后面可以跟正则表达式以匹配我们指定的tag,只有匹配成功的tag对应的日志才会运用里面的配置。
4、flush_interval是用来控制多长时间将日志写入elasticsearch一次。
```
### 安装elasticsearch
```php
elasticsearch 是基于 java 开发的,所以需要先安装java 环境
yum list jdk
yum list installed|grep jdk
yum install java-1.8.0-openjdk.x86_64 -y
yum install -y elasticsearch-5.6.1.rpm
配置文件在/etc/elasticsearch/elasticsearch.yml
network.host: 0.0.0.0 #表示任意ip都可以访问
http.port: 9200
--------------------------------------------
elasticsearch会消耗大量资源,启动速度较慢
systemctl start elasticsearch
systemctl status elasticsearch
systemctl stop elasticsearch
--------------------------------------------
```
因为fluentd需要对elasticsearch支持,所以接下来我们需要安装fluentd的es插件。
(1)安装fluent-plugin-elasticsearch
```
/usr/sbin/td-agent-gem install fluent-plugin-elasticsearch
```
(2)安装fluentd type 插件
```
/usr/sbin/td-agent-gem install fluent-plugin-typecast
```
(3)安装secure-forward 插件(非必须但常用)
```
/usr/sbin/td-agent-gem install fluent-plugin-secure-forward
```
### 安装kibana
```php
cd /tmp
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.6.1-linux-x86_64.tar.gz
tar zxvf kibana-5.6.0-linux-x86_64.tar.gz
mv kibana-5.6.0-linux-x86_64/ /usr/local/kibana/
cd /usr/local/kibana/
./bin/kibana 启动kibana ctrl+c 关掉kibana ,如果需要成为后台进程 加上 &
配置文件修改:kibana/config/kibana.yml
server.host: "0.0.0.0"
server.port: 5601
创建完后
http://192.168.228.137:5601/app/kibana
```
### 小测试
post 测试下 fluentd与 elasticsearch kibana是否连通
```PHP
curl -X POST -d 'json={"123456":"awesome"}' "http://localhost:8888/test.tag.here"
```
多执行几次,等待日志flush 时间,然后看看kibana上有沒有出现
---------------------------------------------------
##安装B机器
### 安装td-agent客户端
```PHP
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
systemctl start td-agent 启动td-agent服务
systemctl status td-agent 查看status状态 出现active (running) 才是正常运行状态的
systemctl stop td-agent 停止td-agent服务
【安装完成后td-agent测试】
td-agent 启动后 默认监听8888端口,监听来自HTTP的请求,可以执行以下命令来测试:
curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
tailf /var/log/td-agent/td-agent.log
【待服务端td-agent配置好后,修改客户端配置】
vim /etc/td-agent/td-agent.conf
<source>
@type unix
path /var/run/td-agent/td-agent.sock
</source>
<match fluentd.**>
# @type stdout
type forward
flush_interval 60s
buffer_type file
buffer_path /var/log/td-agent/buffer/*
<server>
host 192.168.228.137 #远程的td-agent服务器
port 24224 #远程开启的端口
</server>
</match>
```
### 检测客户端与服务端
启动客户端td-agent ,任何时候kibana 出现数据没有及时显示, 查看 `/var/log/td-agent/td-agent.log`是否出现问题。
```PHP
#添加了远程服务端的节点#
adding forwarding server '192.168.228.137:24224' host="192.168.228.137" port=24224 weight=60 plugin_id="object:3fef9606b268"
#本地监听sock#
listening fluent socket on /var/run/td-agent/td-agent.sock
```
### 安装PHP monolog
```PHP
cd /data/
composer require monolog/monolog
touch /data/log.php
php log.php
```
```PHP
#log.php 内容#
<?php
require(__DIR__ . '/vendor/autoload.php');
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SocketHandler;
use Monolog\Formatter\FluentdFormatter;
//FluentLogger已经过去式,现在推荐使用monolog
$logger = new Logger('fluentd.tag');
$socketHandler = new SocketHandler('unix:///var/run/td-agent/td-agent.sock');
$socketHandler->setFormatter(new FluentdFormatter());//fluentd 格式才能写入
$socketHandler->setPersistent(true);
$logger->pushHandler($socketHandler,Logger::INFO);//DEBUG 及以上级别会写入
$tag_arr = array('kpcenter.blue','kpcenter.red');
for($i=0;$i<5;$i++){
$name = $tag_arr[mt_rand(0,1)];
$logger->error($name, json_decode('{"buyer_title":"\u6d77\u5357\u9ad8\u670b\u79d1\u6280\u6709\u9650\u516c\u53f8","buyer_title_type":2,"extra":"\u90d1\u5dde\u673a\u573a\u5e97 00117060608160028","buyer_taxcode":"91469027MA5RH09M0R","result_call_back":"http:\/\/allinvoice.zhouheiya.cn\/invoice-center\/blue-invoice-done","agent_name":"","buyer_address":"","buyer_bank_name":"\u4e2d\u56fd\u5de5\u5546\u94f6\u884c\u6f84\u8fc8\u8f6f\u4ef6\u56ed\u652f\u884c","buyer_bank_account":"2201080509100089564","buyer_phone":"","buyer_email":"","user_openid":"oF_Yo0fTF1SAjqnihqqFm7sXVezg","wx_union_id":"o1jrlwoortptNRurHGDRR7483fco","b_unique_id":"zbd_HBWHCS_00117060608160028","channel":"GP430000","buyer_bank_info":"\u4e2d\u56fd\u5de5\u5546\u94f6\u884c\u6f84\u8fc8\u8f6f\u4ef6\u56ed\u652f\u884c 2201080509100089564","sign_type":"RSA2","sell_id":"5","sell_name":"\u6e56\u5317\u4e16\u7eaa\u613f\u666f\u5546\u8d38\u6709\u9650\u516c\u53f8","sell_tax_code":"91420102669539796R","sell_bank_name_account":" ","sell_address_phone":"\u6b66\u6c49\u5e02\u6c5f\u5cb8\u533a\u80dc\u5229\u8857128-134\u53f7\u65b0\u6e90\u5927\u53a6307\u5ba4 18662202587","sell_bank_name":"","sell_address":"\u6b66\u6c49\u5e02\u6c5f\u5cb8\u533a\u80dc\u5229\u8857128-134\u53f7\u65b0\u6e90\u5927\u53a6307\u5ba4","sell_bank_account":null,"sell_phone":"18662202587","sell_drawer":"\u66fe\u4e16\u82b1","sell_payee":"\u80e1\u5706","sell_reviewer":"\u6c6a\u7131\u94f6","buyer_address_phone":" ","is_hide_detail":"0","goods_collect_name":"","goods_info":[{"name":"\u9e2d\u8116\u5b50","models":"","unit":"","total_price":"5.5","total":"1.000000","tax_code":"8888888888","tax_type":"halogen_product","tax_rate":"0.17","zero_tax_flag":"","c_total_price":"4.70","tax_amount":"0.80","has_tax":0,"fp_property":0,"per_price":"4.70000000","discount":-1,"discount_rate_value":"0.1818"}],"header_info":{"total_price":"4.70","fax_price":0.8,"fax_total_price":"5.5","goods_tax_type":"halogen_product","goods_tax_rate":"0.17"},"gp_unique_id":"20170920000000000515058746403098","invoice_state":1,"has_red":0,"is_red":0,"invoice_type":0,"app_id":"2017090759540391","buy_client_id":"2","relation_id":"28"}',true));
}
```