在複雜的企業應用服務羣中,記錄日誌方式多種多樣,而且不易歸檔以及提供日誌監控的機制。不管是開發人員仍是運維人員都沒法準確的定位服務、服務器上面出現的種種問題,也沒有高效搜索日誌內容從而快速定位問題的方式。所以須要一個集中式、獨立的、蒐集管理各個服務和服務器上的日誌信息,集中管理,並提供良好的UI界面進行數據展現,處理分析。html
得此:ELK提供一套開源的解決方案,能高效、簡便的知足以上場景。java
框架 | 簡介 | 做用 |
Elasticsearch | 開源分佈式搜索引擎,提供存儲、分析、搜索功能。特色:分佈式、基於reasful風格、支持海量高併發的準實時搜索場景、穩定、可靠、快速、使用方便等。 | 接收蒐集的海量結構化日誌數據,並提供給kibana查詢分析 |
Logstash | 開源日誌蒐集、分析、過濾框架,支持多種數據輸入輸出方式。 | 用於收集日誌,對日誌進行過濾造成結構化數據,並轉發到elasticsearch中 |
Kibana | 開源日誌報表系統,對elasticsearch以及logstash有良好的web頁面支持。 | 對elasticsearch提供的數據進行分析展現 |
因爲Logstash消耗資源大,而服務器資源至關寶貴,因此引進另外一個輕量級日誌採集框架Beats,其中包含如下6種node
Packetbeat | 用於蒐集網絡流量數據 |
Heartbeatlinux |
用於運行時間監控 |
Filebeat | 用於蒐集文件數據 |
Winlogbeat | 用於蒐集winodws事件數據 |
Metricbeat | 用於指標 |
Auditbeat | 用於審計數據 |
因爲logstash消耗性能,因此高併發場景容易遇到流量上的瓶頸,及時使用logstash集羣也是如此,因此能夠添加中間件進行日誌緩存處理。因爲logstash數據源具備多種方式,全部中間件也能夠不少選擇,常見的有kafka,redis。web
Elasticsearch | 官網elasticsearch-6.3.1.tar | elasticsearch官方文檔 |
Kibana | 官網kibana-6.3.1下載 linux64位 | kibana官方文檔 |
Logstash | 官網logstash-6.3.1.tar | logstash官方文檔 |
Filebeat | 官網filebeat-6.3.0 linux64位 | beats官方文檔 |
下面只介紹,方案2:Logstash獨立部署,微服務節點經過網絡向Logstash發送日誌信息。redis
一、jdk1.8spring
二、Elasticsearch安裝參考:ES系列1、CentOS7安裝ES 6.3.1json
三、啓動 Elasticsearchvim
一、解壓到安裝目錄便可緩存
/home/kibana-6.3.1-linux-x86_64
二、修改配置文件
vi /home/kibana-6.3.1-linux-x86_64/config/kibana.yml
server.port: 5601 ##服務端口 server.host: "0.0.0.0" ##服務器ip 本機 elasticsearch.url: "http://localhost:9200" ##elasticsearch服務地址 與elasticsearch對應
三、啓動kibana
/home/kibana-6.3.0-linux-x86_64/bin/kibana #命令窗啓動
四、關閉kibana
ps -ef | grep kibana #後臺線程關閉 kill -9 4525 ##pid 4525 爲查處線程的pid
五、驗證kibana啓動
一、下載
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.3.1.tar.gz
tar -zxvf logstash-6.3.1.tar.gz
二、建立配置文件logstash-es.conf
vim /home/logstash-6.3.1/conf.d/logstash-es.conf
複製一下內容:
input { tcp { port => 10514 codec => "json" } } output { elasticsearch { action => "index" hosts => ["localhost:9200"] index => "%{[appname]}" } }
10514:接受日誌端口
hosts => ["localhost:9200"] :es的ip和端口
"%{[appname]}" :取值日誌中appname值爲索引
三、檢測配置文件是否有錯:
/home/logstash-6.3.1/bin/logstash --path.settings /home/logstash-6.3.1/config/ -f /home/logstash-6.3.1/config/conf.d/logstash-es.conf--config.test_and_exit Sending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties Configuration OK # 爲ok則表明配置文件沒有問題 [root@data-node1 /usr/share/logstash/bin]#
命令說明:
四、指定配置文件,啓動logstash:
/home/logstash-6.3.1/bin/logstash --path.settings /home/logstash-6.3.1/config/ -f /home/logstash-6.3.1/config/conf.d/logstash-es.confSending Logstash's logs to /var/log/logstash which is now configured via log4j2.properties # 這時終端會停留在這裏,由於咱們在配置文件中定義的是將信息輸出到當前終端
五、驗證
打開新終端檢查一下10514端口是否已被監聽:
[root@data-node1 ~]# netstat -lntp |grep 10514 tcp6 0 0 :::10514 :::* LISTEN 4312/java [root@data-node1 ~]#
一、maven
<!--logback日誌-->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.8</version>
</dependency>
二、logback.xml添加logstash配置
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <param name="Encoding" value="UTF-8"/> <remoteHost>192.168.1.102</remoteHost> <port>10514</port> <!-- <filter class="com.program.interceptor.ELKFilter"/>-->//引入過濾類 <!-- encoder is required --> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" > <customFields>{"appname":"${appName}"}</customFields> // 索引名 </encoder> </appender>
logback.xml以下:
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true"> <contextName>MovieBooking</contextName> <timestamp key="TIMESTAMP" datePattern="yyyy-MM-dd" /> <property name="LOGPATH" value="log" /> <springProperty scope="context" name="appName" source="server.Name" defaultValue="localhost.log"/> <!-- 輸出到控制檯 --> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern> %d{HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n </pattern> </layout> </appender> <!-- 輸出到文件 --> <appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOGPATH}${file.separator}${TIMESTAMP}.log</file> <append>true</append> <encoder> <pattern> %d{HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n </pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOGPATH}${file.separator}all${file.separator}%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender> <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <param name="Encoding" value="UTF-8"/> <remoteHost>192.168.1.102</remoteHost> <port>10514</port> <!-- <filter class="com.program.interceptor.ELKFilter"/>-->//引入過濾類 <!-- encoder is required --> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" > <customFields>{"appname":"${appName}"}</customFields> </encoder> </appender> <root level="INFO"> <appender-ref ref="fileLog" /> <appender-ref ref="stdout" /> <appender-ref ref="logstash" /> </root> </configuration>
三、測試
添加單元測試類:
package com.example.demo; import com.example.service.StudentService; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringRunner.class) @SpringBootTest @Slf4j @WebAppConfiguration public class DemoApplicationTests { @Autowired private StudentService studentService; @Test public void Test() { log.info("測試日誌{}","颱風山竹,威力很大!"); log.info(studentService.findAllStudent().get(0).toString()); } }
執行:
四、驗證