jdk:1.8
yum install java -y
Logstash:日志收集
ElasticSearch:日志存儲與搜索
Kibana:日志展示
我畫了個草圖,通常的架構圖如下:AppServer 發送日志給Logstash服務器收集,ElasticSearch服務器負責日志的查詢和存儲,Kibana負責日志的展示
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.0
(1)wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.0.tar.gz下載安裝包
(2)tar -xzvf logstash-6.0.0.tar.gz解壓
解壓后是沒有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的集成到此結束。