jdk:1.8java
yum install java -ylinux
Logstash:日誌收集web
ElasticSearch:日誌存儲與搜索redis
Kibana:日誌展現spring
我畫了個草圖,一般的架構圖以下:AppServer 發送日誌給Logstash服務器收集,ElasticSearch服務器負責日誌的查詢和存儲,Kibana負責日誌的展現apache
1. Logstash的安裝,官網連接:https://www.elastic.co/downloads/logstash#ga-release,也能夠直接執行:wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.tar.gz,目前最新版本6.0.0json
(1)wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.tar.gz下載安裝包centos
(2)tar -xzvf logstash-6.0.0.tar.gz解壓api
解壓後是沒有logstash的配置文件的,須要手動建立一個,上面截圖的logstash.conf就是我手動建立的,爲了測試,只是配置了簡單的標準輸入和標準輸出,內容以下:瀏覽器
input { stdin { } } output { stdout { codec => rubydebug {} } }
(3) 嘗試啓動logstash並驗證是否配置成功,在logstash的解壓目錄下執行命令:./bin/logstash -f logstash.conf,出現以下截圖代表配置成功,從啓動信息中也能看出日誌路徑,端口等信息
在交互裏隨便輸入測試hello world,看看輸出吧
2.ElasticSearch安裝,官網連接:https://www.elastic.co/downloads/elasticsearch,截止目前最新版本5.6.3
(1) wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.3.tar.gz
(2) tar -xzvfelasticsearch-5.6.3.tar.gz解壓
(3) 進入到elasticsearch的安裝目錄的config下,修改配置: vi elasticsearch.yml
path.data修改成本身本機的data路徑,自定義(這個路徑若是不存在的話須要手動去建立)
path,logs修改成本身本機的logs路徑,也是自定義吧(這個路徑若是不存在的話,啓動elasticsearch會自動建立)
network.host修改成安裝服務器地址
http.port爲http訪問端口,默認是9200,我這裏給的9201
分別給上面設置的data和logs設置用戶權限
chown -R elsearch:elsearch data/es/
chown -R elsearch:elsearch logs/es/
(4)運行elasticsearch:./bin/elasticsearch,若是直接用root身份去運行,會報以下錯誤:
elasticsearch默認是不能用root去啓動的,這是出於系統安全考慮設置的條件,因此爲elasticsearch建立一個用戶組和用戶吧
建立elseaerch用戶組及用戶:
groupadd elsearch
useradd elsearch -g elsearch -p elasticsearch
更改elasticsearch文件夾及內部文件的所屬用戶及組爲elsearch:elsearch:
chown -R elsearch:elsearch elasticsearch-5.6.3
切換用戶elsearch:
su elsearch
啓動elasticsearch:./bin/elasticsearch
啓動過程當中有可能報以下錯誤
切換到root用戶編輯limit.conf文件
vi /etc/security/limits.conf
在文件末尾添加
elsearch soft nofile 65536
elsearch hard nofile 65536
注意:elsearch爲所建立的用戶名稱,建立的是什麼就寫什麼
而後再切換到elsearch用戶啓動,看到以下信息說明啓動成功
在瀏覽器中方位地址http://192.168.212.37:9201,192.168.212.37和9201都是上面elasticsearch.yml中配置的host和port,會出先以下界面說明啓動成功
3.完成logstash和elasticsearch的安裝後,就該開始集成他們倆了,回到logstash的配置文件logstash.conf,修改配置以下:輸入仍是標準輸入,輸出增添一個elasticsearch,hosts配置elasticsearch的地址和端口:
input { stdin { } } output { elasticsearch { hosts => "192.168.212.37:9201" index => "logstash-test" } stdout { codec => rubydebug {} } }
再次啓動logstash,並輸入測試字符串:hello world
在啓動logstash過程當中檢查並鏈接output端elasticsearch,輸入測試字符串後,訪問elasticsearch的api:http://192.168.212.37:9201/logstash-test/_search(logstash-test是logstash.conf中配置的索引index),能夠看到以下:剛纔輸入的hello已經在elasticsearch中能夠查看到了
至此,logstash和elasticsearch集成完成,不過經過elasticsearch原生api去查詢仍是不方便和直觀,ok,下面查詢工具kibana閃亮登場了。
4.下載kibana
(1)wget https://artifacts.elastic.co/downloads/kibana/kibana-5.6.3-linux-x86_64.tar.gz
(2)tar -xzvf kibana-5.6.3-linux-x86_64.tar.gz 解壓
(3)進入kibana的解壓目錄的config目錄下,編輯kibana.yml,server.port:5601放開,server.host修改成kibana的安裝服務器,配置elasticsearch的路徑端口
(4)啓動kibana: ./bin/kibana
瀏覽器中訪問:http://192.168.212.37:5601,出現以下界面表示啓動成功
再在logstash的交互中輸入:Hello kaka,you are the best
而後再kibana的discover中指定的index裏查詢kaka關鍵字,以下:日誌是否是很優雅的展現出來了
OK,ELK的集成到此結束。
5.安裝redis
(1)安裝redis(省略,安裝很簡單)
(2)進入redis的解壓目錄,編輯reids.conf配置文件,修改以下三個地方:
bind IP:綁定安裝服務器的ip地址
protected-mode:修改成no,不然redis只有本機才能訪問
port:修改成本身的端口,默認是6379
(3)啓動redis
執行./src/redis-server redis.conf ,若是提示須要增長文件句柄數,可使用名利ulimit -n 10032臨時增大,10032是redis建議的大小。
6.logstash集成redis,先看架構圖
下面的架構圖中,redis至關於變成了logstash的輸入端,而不是appserver,爲何要這樣作的,是爲了防止一瞬間忽然有大量日誌到logstash端防止雪崩,至關於給APPserver和logstash間加了一個管道。
(1)編輯logstash的logstash.conf文件,輸入端修改成redis
input { redis { data_type => "list" type => "redis-input" key => "logstash:redis" host => "192.168.212.37" port => 6379 threads => 5 codec => "json" } } output { elasticsearch { hosts => "192.168.212.37:9201" index => "logstash-test" } stdout { codec => rubydebug {} } }
(2)從新啓動logstash,能夠看到已經鏈接上了輸入端redis
logstash和redis的集成已經完成。
7.redis和java項目中log4j的集成
經過上面的配置,基本上已經實現了上面架構圖的大部分功能,最後須要的就是項目中的日誌如何輸入到redis中呢,且看下面配置。
爲了簡單起見,我直接在spring官網建立一個springboot的web項目,地址http://start.spring.io/,快速構建一個可運行的spring mvc框架出來(spring boot已經集成了log4j等一系列,無需再去配置),只是爲了測試日誌,項目結構很簡單,以下:
主要代碼講解:
先看pom的配置
由於要和redis結合,添加以下dependency
貼上pom配置:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.a</groupId> <artifactId>elk_logback</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.cwbase</groupId> <artifactId>logback-redis-appender</artifactId> <version>1.1.5</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
springboot默認已經集成了logback,,若是須要覆蓋,在resources下建立本身的logback.xml配置文件,以下:
其中host爲redis安裝服務器,key爲logstash.conf中配置的key
logback,xml配置:
貼上logback.xml配置
<?xml version="1.0" encoding="UTF-8"?> <configuration> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <Target>System.out</Target> <encoder> <pattern>[%d{HH:mm:ss}][%t][%p][%c]-%m%n</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>info</level> </filter> </appender> <appender name="LOGSTASH" class="com.cwbase.logback.RedisAppender"> <source>logstashdemo</source> <type>dev</type> <host>192.168.212.37</host> <key>logstash</key> <tags>dev</tags> <mdc>true</mdc> <location>true</location> <callerStackIndex>0</callerStackIndex> </appender> <root level="error"> <appender-ref ref="Console"/> <appender-ref ref="LOGSTASH"/> </root> </configuration>
HelloController很簡單,打印測試日誌:
package com.kaka.controller; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller @EnableAutoConfiguration public class HelloController { private static org.slf4j.Logger logger = LoggerFactory.getLogger(HelloController.class); @RequestMapping(value = "/hello",method = RequestMethod.GET) @ResponseBody public String sayHello(){ logger.info("The request is to sayHello"); logger.error("This is test error log"); return "hello,kaka"; } public static void main(String[] args){ SpringApplication.run(HelloController.class,args); } }
啓動項目(上面的logstash.conf我配置了兩個輸出,一個是elasticsearch,一個是交互標準輸出),能夠在logstash的交互中看到springboot的啓動日誌,訪問HelloController,能夠看到輸出的error級別日誌
啓動項目(上面的logstash.conf我配置了兩個輸出,一個是elasticsearch,一個是交互標準輸出),能夠在logstash的交互中看到springboot的啓動日誌,訪問HelloController,能夠看到輸出的error級別日誌,以下圖:
而後再kibana的discover中指定的index裏查詢kaka關鍵字,以下:日誌是否是很優雅的展現出來了
OK,ELK的集成到此結束。