## 框架概覽

* ElasticSearch
有強大的搜索功能的無模式數據庫,可以簡單的很想擴展,索引每一個字段,可以聚合分組數據。

* Logstash
用Ruby編寫的,我們可以使用管道輸入和輸出數據到任何位置。一個可以抓取,轉換,存儲事件到ElasticSearch的ETL管道。打包版本在JRuby上運行,并使用幾十個線程進行并行的數據處理,利用了JVM的線程功能。

* Kibana
基于web的數據分析,為ElasticSearch儀表板的工具。充分利用ElasticSearch的搜索功能,以秒為單位可視化數據。支持Lucene的查詢字符串的語法和Elasticsearch的過濾功能。

## 前提
* 本文中架構基于docker搭建,需要您了解docker的基本概念,基本操作和docker1.9之后的自定義overlay網絡
> 本文只介紹了最簡化搭建。如果您用于生產,還需要在如下方面完善
1.elastic是有存儲目錄,需要在docker中進行數據卷映射。配置文件elasticsearch.yml需要根據自己需求自行配置。請參考:https://hub.docker.com/_/elasticsearch/
2.Dockerhub官方提供的鏡像基于不同的基礎鏡像,不利于網絡傳輸!建議根據自己組織內部鏡像重新創建!
## Docker搭建ELK的javaweb應用日志收集存儲分析系統
### 第一步:啟動elasticsearch
```
docker run -d --name myes \
--net=multihost --ip=192.168.2.51 \
elasticsearch:2.3
```
* 采用docker自定義overlay網絡multihost,設置容器ip為192.168.2.51
### 第二步:啟動kibana
```
docker run --name mykibana \
-e ELASTICSEARCH_URL=http://192.168.2.51:9200 \
--net=multihost \
-p 5601:5601 \
-d kibana:4.5
```
* 采用自定義網絡multihost,ip隨機分配
* 在宿主機啟動kibana,容器端口5601映射到宿主機端口5601,可以通過http://<宿主機ip>:5601訪問kibana
* 參數ELASTICSEARCH_URL指向第一步中啟動的elasticsearch
### 第三步:logstash配置文件
* logstash.conf,這個文件名字可以隨便起
```
input {
log4j {
mode => "server"
host => "0.0.0.0"
port => 3456
type => "log4j"
}
}
output {
elasticsearch { hosts => ["192.168.2.51"] }
}
```
* 輸入模式log4j的服務,監聽于當前容器的3456端口。也就是數據源需要向容器的3456端口發送日志。
### 第四步:啟動logstash
```
docker run -d \
-v "$PWD":/config-dir \
-p 3456:3456 \
--net multihost \
logstash:2.3 \
logstash -f /config-dir/logstash.conf
```
* 采用自定義網絡multihost,ip隨機分配
* 在宿主機啟動logstash,容器端口3456映射到宿主機端口3456.(這么做是假設您的應用不是docker化的,所以ip不在自定義網絡multihost內.如果web應用docker化,并與logstash共同使用同一個自定義網絡,則端口不需要對外映射)
* 容器配置文件/config-dir/logstash.conf映射到宿主機當前目錄下面。即你需要將logstash.conf放到當前目錄"$PWD"下啟動。(這個目錄可以調整)
### 第五步:web應用log4j日志TCP輸出
* 為log4j.properties添加tcp輸出,代碼片段如下:
```
log4j.rootLogger = DEBUG,tcp
log4j.appender.tcp=org.apache.log4j.net.SocketAppender
log4j.appender.tcp.Port=3456
log4j.appender.tcp.RemoteHost=192.168.1.158
log4j.appender.tcp.ReconnectionDelay=10000
log4j.appender.tcp.Application=ssmm
```
* RemoteHost是logstash所在的宿主機ip.如果您的web應用docker化,可以是容器ip
* 發送日志到3456端口
> 最重要的事不要忘了,啟動您的web應用。日志才能發過去!
# 絕不忽悠,看看結果
* 以下為原始日志,您可以用kibana強大的配置來展現您的日志分析
