elk.md 6.87 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
# 日志管理 ELK(ElasticSearch+Logstash+Kibana)
## 简介:
**ElasticSearch:**一个开源分布式搜索引擎,具有分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等特点。<p>**Logstash:**一个完全开源的工具,可以对你的日志进行搜集,过滤,并将其储存供以后使用。<p>**Kibana:**为Logstash和ElasticSearch提供日志分析的友好Web界面,可以汇总,分析和搜索重要的数据日志。
##下载说明:
由于Logstash的运行依赖于Java环境, 而Logstash 1.5以上版本不低于java 1.7,因此推荐使用最新版本的Java。因为我们只需要Java的运行环境,所以可以只安装JRE,不过这里我依然使用JDK,请自行搜索安装<p>
ELK下载https://www.elastic.co/downloads/
## 使用说明:
### ElasticSearch:
#### 启动服务:
 运行bin/elasticsearch.bat文件开启服务。查看127.0.0.1:9200出现如下页面运行成功<p>
#![](/assets/elasticsearch.png)  <p>
#### 基础操作:es支持restful操作。<p>
获取对应文档:<p>
GET /[_index]/[_type]/_search <p>
上传文档: <p>
```javascript
PUT /[_index]/[_type]/[_id}
{ "first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums",
"interests": [ "music" ] }
```
<p>
操作文档:http://es.xiaoleilu.com/030_Data/15_Get.html

#### 面向文档:
Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。这种理解数据的方式与以往完全不同,这也是Elasticsearch能够执行复杂的全文搜索的原因之一。<p>
ELasticsearch使用JSON,作为文档序列化格式。
以下使用JSON文档来表示一个用户对象:<p>
```javascript
{
"email": "john@smith.com",
"first_name": "John",
"last_name": "Smith",
"info": {
    "bio": "Eco-warrior and defender of the weak",
    "age": 25,
    "interests": [ "dolphins", "whales" ]
    },
"join_date": "2014/05/01"
    }

```
在Elasticsearch中,文档归属于一种类型(type),而这些类型存在于索引(index)中,我们可以画一些简单的对比图来类比传统关系型数据库:<p>
Relational DB -> Databases -> Tables -> Rows -> Columns<p>
Elasticsearch -> Indices -> Types -> Documents -> Fields<p>
Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。
#### elasticsearch 分布式:
Elasticsearch为分布式而生
Elasticsearch致力于隐藏分布式系统的复杂性。以下这些操作都是在底层自动完成的:<p>
*将你的文档分区到不同的容器或者分片(shards)中,它们可以存在于一个或多个节点中。<p>

*将分片均匀的分配到各个节点,对索引和搜索做负载均衡。<p>

*冗余每一个分片,防止硬件故障造成的数据丢失。<p>

*将集群中任意一个节点上的请求路由到相应数据所在的节点。<p>

*无论是增加节点,还是移除节点,分片都可以做到无缝的扩展和迁移<p>
#### 集群部署:
伪分布式环境搭建:创建3个es环境,修改其config/elasticsearch.yml配置文件<p>
1:<p>
cluster.name: elasticsearch<p>
node.name: node1<p>
2:<p>
cluster.name: elasticsearch<p>
node.name: node2<p>
http.port: 9202<p>
3:<p>
cluster.name: elasticsearch<p>
node.name: node3<p>
http.port: 9203<p>
es会自动搜索同一网段下的cluster.name(集群名)相同的es做成集群
将indeces(索引)下的分片(默认一个索引5个主分片每个分片一个复制分片)平分到不同es节点(node)下。
#### elasticsearch-head插件安装:
是es集群管理插件。执行如下命令安装插件:<p>
elasticsearch/bin/plugin install mobz/elasticsearch-head<p>
打开:http://localhost:9200/_plugin/head/ <p>
下图为以上操作建立的集群。
![](/assets/es.png)  <p>

相关文档:http://es.xiaoleilu.com/020_Distributed_Cluster/05_Empty_cluster.html <p>
### Logstash:
#### 运行:
logstash -e input { stdin { } } output { stdout { codec => rubydebug } } <p>
输入报文 helloworld 可以在控制台看到对应报文。<p>
2016-10-20T09:05:53.446Z LAPTOP-RKIO0CO4 hellowrold <p>
#### 通过配置文件运行:
 在bin目录下创建配置文件test.conf:  <p>
 input为logstash配置输入流,logstash支持多种input方式包括file redis TCP UDP syslog lumberjack等。<p>

 filter过滤logstash输入流,并可以解析输入流。<p>

 ouput为logstash输出流,支持多种输出方式如elsaticearch file email tcp hdfs等,并可以配置相关参数如在es中配置索引名和type名<p>
<p> 示例使用file方式获取logstash输入流需将path更改为项目log地址<p>

```
input {

 file{

 path => "C:\Users\zjl\.IntelliJIdea2016.2\system\tomcat\Unnamed_hap-parent\logs\hap.log"

 start_position =>"beginning"

 }

}

filter{

 if ([message] =~ "^\s") {

 drop {}

 }

 grok{

 match => ["message", " .* %{GREEDYDATA:level} \[%{GREEDYDATA:accountId}\] \[%{GREEDYDATA:requestId}\] %{GREEDYDATA:dao} - %{GREEDYDATA:info}\s"]

 }

}

output {

 stdout {

 }

elasticsearch {

 hosts => "localhost:9200"

 }

}

```
<p>若使用tcp为logstash配置输入修改logback.xml文件添加输出方式<p>
```
<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> 
<encoder> 
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%X{accountId}] [%X{requestId}] %logger - %msg%n</pattern> 
</encoder> 
<destination>elk-hap:4560</destination></appender>

```
<p>
相关文档:http://kibana.logstash.es/content/logstash/plugins/input/file.html
<p>
 在Logstash文件/bin目录下打开终端输入logstsh -f test.conf运行logstash解析日志文件  <p>
 作为一个要长期运行的程序。发行包内都带有sysV或者systemd风格的启动程序配置,你只需要直接使用即可,以RPM为例 /etc/init.d/logstash 脚本中,会加载 /etc/init.d/functions 库文件,利用其中的 daemon 函数,将 logstash 进程作为后台程序运行。所以,你只需把自己写好的配置文件,统一放在 /etc/logstash/conf.d 目录下(注意目录下所有配置文件都应该是 .conf 结尾,且不能有其他文本文件存在。因为 logstash agent 启动的时候是读取全文件夹的),然后运行 service logstash start 命令即可。<p>
![](/assets/logstash.png)
<p>
### Kibana:
##### 打开文件bin目录下kibana.bat开启服务  <p>  <p>
##### 浏览器打开localhost:5601查看通过logstash解析的日志文件
##### config/kibana.yml文件可进行对kibana相关配置 <p> <p>
![](/assets/kibana.png)
![](/assets/kibanaview.png)