程式運作避免不了出錯,測試環境時我們可以通過打斷點定位問題。但是上線之後的項目出bug,進行定位時就需要檢視日志。spring cloud進行分布式部署後會有多個微服務,每個微服務都會産生日志,怎麼進行日志分類,按條件索引想要看到的報錯内容呢?現在流行的日志監控系統ELK完美解決這個問題。本文整理了ELK單機版在Linux系統進行搭建,以及springboot将日志關聯到ELK系統。
ELK是由三個工具整合的日志系統(elasticsearch、logstash、kibana)。
Elasticsearch:起到的作用是日志索引,快速根據不同條件找到我們想看到的日志。
Logstash:起到的作用是日志收集,各個微服務将日志關聯到logstash。
kibana:起到的作用是可視化UI界面。檢視日志總歸是有個圖形化界面比較好看實用。
一 、安裝Elasticsearch
- 下載下傳,我用的6.4.1版本,新版本沒用過,也沒了解有啥變化,還是穩重求勝比較好。下載下傳位址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-4-1
- 解壓縮:
tar -zxvf elasticsearch-6.4.1.tar.gz -C /usr/local
這時,/usr/local目錄下就有elasticsearch-6.4.1目錄了
cd /usr/local/ elasticsearch-6.4.1
3. 編輯配置檔案并啟動
vi /config/elasticsearch.yml 修改基本配置(注意的點,:後面跟一個空格。它是yml格式的檔案)
network.host: 192.168.0.85 單機配置成本機位址即可
http.port: 9200 端口預設9200
這時就配置完成,但是它不允許root運作,是以我們建立個帳号來運作它
useradd elk
passwd elk
輸入倆次密碼 回到上級目錄并更改elasticsearch的擁有者:
chown -R elk elasticsearch-6.4.1
這時切換到elk使用者,執行
su elk
指令完成切換
cd elasticsearch-6.4.1
背景運作它,并将啟動日志輸入
nohup ./bin/elasticsearch &
檢視elasticsearch運作日志指令
vi nohup.out 檢視截至到目前日志
tailf nohup.out 實時檢視運作日志
二 、安裝Logstash
- 下載下傳,我用的6.4.1版本,新版本沒用過,也沒了解有啥變化,還是穩重求勝比較好。下載下傳位址:https://www.elastic.co/cn/downloads/past-releases/logstash-6-4-1
- 解壓縮:
tar -zxvf logstash-6.4.1.tar.gz -C /usr/local
cd /usr/local/logstash-6.4.1/
3. 編輯配置檔案并啟動
建立一個配置檔案
vi config/logstash.conf (logstash.conf 名字可自定義)
以下為logstash中基本配置:
input {
tcp {
port => "5044"
codec => "json"
}
}
output {
elasticsearch {
action => "index"
hosts => ["192.168.195.201:9200"]
index => "%{[appname]}"
}
}
啟動logstash
nohup ./bin/logstash -f ./config/logstash.conf &
檢視logstash運作日志指令
vi nohup.out 檢視截至到目前日志
tailf nohup.out 實時檢視運作日志
三 、安裝Kibana
- 下載下傳,我用的6.4.1版本,新版本沒用過,也沒了解有啥變化,還是穩重求勝比較好。下載下傳位址:https://www.elastic.co/cn/downloads/past-releases/kibana-6-4-1
- 解壓縮:
tar -zxvf kibana-6.4.1-linux-x86_64.tar.gz -C /usr/local/
3. 編輯配置檔案并啟動
cd /usr/local/kibna-6.4.10linux-x86_64
vi config/kibana.yml
下邊為kinaka中需要配置的
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.0.85:9200"
elasticsearch.username: "elastic"
elasticsearch.password: "changeme"
啟動kibana
nohup ./bin/kibana &
檢視kibana運作日志指令
vi nohup.out 檢視截至到目前日志
tailf nohup.out 實時檢視運作日志
四、springboot中關聯Logstash日志
logback.xml檔案如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true"
scanPeriod="1 seconds">
<include
resource="org/springframework/boot/logging/logback/base.xml" />
<!-- <jmxConfigurator/> -->
<contextName>logback</contextName>
<property name="log.path" value="/home/xxx.log" /> <!--存儲日志到伺服器路徑配置 -->
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID} --- [%15.15t] %-40.40logger{39} : %m%n" />
<!--輸出到控制台 -->
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是為開發使用,隻配置最底級别,控制台輸出的日志級别是大于或等于此級别的日志資訊 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 設定字元集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="file"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>info-%d{yyyy-MM-dd}-%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>
</appender>
<!--下邊socket關聯logstash -->
<appender name="socket"
class="net.logstash.logback.appender.LogstashSocketAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<host>192.168.0.85</host>
<port>5044</port>
<customFields>{"appname":"appname"}</customFields>
</appender>
<appender name="LOGSTASH"
class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.0.85:5044</destination>
<!-- encoder必須配置,有多種可選 -->
<encoder charset="UTF-8"
class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"appname":"appname"}</customFields>
</encoder>
<connectionStrategy>
<roundRobin>
<connectionTTL>5 minutes</connectionTTL>
</roundRobin>
</connectionStrategy>
</appender>
<root level="info">
<!-- <appender-ref ref="file" /> -->
<appender-ref ref="socket" />
<appender-ref ref="LOGSTASH" />
</root>
</configuration>