前言
ELK官方的
中文文檔寫的已經挺好了,為啥還要記錄本文?因為我發現,我如果不寫下來,過幾天就忘記了,而再次撿起來必然還要經曆資料查找篩選測試的過程。雖然這個過程很有意義,但并不總是有那麼多時間去做。是以,接下來的内容僅僅是我根據查詢到的資料,篩選,組裝,測試後達到我的目标的一個過程。
什麼是ELK
K我最初還以為是Kafka,事實上,ELK平台是一個完整的日志分析解決方案,由這三個開源工具建構而成:Elasticsearch、Logstash、Kibana。
Elasticsearch用于深度搜尋和資料分析,它是基于Apache Lucene的分布式開源搜尋引擎,無須預先定義資料結構就能動态地對資料進行索引;
Logstash用于日志集中管理,包括從多台伺服器上傳輸和轉發日志,并對日志進行豐富和解析,是一個資料管道,提供了大量插件來支援資料的輸入和輸出處理;
最後是Kibana,提供了強大而美觀的資料可視化,Kibana完全使用HTML和Javascript編寫,它利用Elasticsearch 的RESTful API來實作其強大的搜尋能力,将結果顯示位各種震撼的圖形提供給最終的使用者。
安裝Elasticsearch
官網下載下傳對應平台的安裝包。
Windows用法比較簡單,隻要下載下傳後雙機bin/elasticsearch.bat就啟動成功了. 下面關注linux上的安裝使用。
ES不允許root運作,是以,最好我們建立專門的使用者來運作。
解壓後,運作
./bin/elasticsearch
就會啟動成功。如果失敗,應該是用root啟動的,改成普通使用者即可。
然後浏覽器通路:http://localhost:9200/ 可以看到響應
{
"name": "ZSedUub",
"cluster_name": "elasticsearch",
"cluster_uuid": "_pS5AOR4Rf2oGPk5uRKK-A",
"version": {
"number": "6.2.4",
"build_hash": "ccec39f",
"build_date": "2018-04-12T20:37:28.497551Z",
"build_snapshot": false,
"lucene_version": "7.2.1",
"minimum_wire_compatibility_version": "5.6.0",
"minimum_index_compatibility_version": "5.0.0"
},
"tagline": "You Know, for Search"
}
安裝Kibana
下載下傳對應平台的安裝包。然後,解壓。
啟動:
./bin/kibana
浏覽器通路: http://localhost:5601
安裝logstash
這裡采用壓縮包的方式,當然也可以使用系統安裝包,比如
//ubuntu
sudo apt-get update && sudo apt-get install logstash
centos
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
在/etc/yum.repos.d/ 建立logstash.repo
[logstash-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
sudo yum install logstash
甚至docker。
修改ruby倉庫位址為中國:編輯
Gemfile
修改為
source "https://gems.ruby-china.org/"
bin/logstash -e 'input { stdin { } } output { stdout {} }'
這是一個互動式輸入,你輸入的内容将被當做message收集起來。
test
{
"message" => "test",
"@version" => "1",
"@timestamp" => 2018-05-26T14:29:09.212Z,
"host" => "ryan-900X5L"
}
到這裡就算安裝成功了。
遇到的問題,
Unsupported platform: x86_64-linux
原因是Java9不支援,解除安裝Java9即可。
安裝
logstash-codec-json_lines
插件
ryan@ryan-900X5L:~/apps/logstash-6.2.4$ ./bin/logstash-plugin install logstash-codec-json_lines
Validating logstash-codec-json_lines
Installing logstash-codec-json_lines
Installation successful
接下來,我們直接編寫我們springboot需要的配置方案,建立config/logstash-sample.conf
input {
tcp {
port => 4560
codec => json_lines
}
}
output{
elasticsearch {
hosts => ["localhost:9200"]
index => "%{[appName]}-%{+YYYY.MM.dd}" #用一個項目名稱來做索引
}
stdout { codec => rubydebug }
}
- 4560 是logstash接收資料的端口
- codec => json_lines是一個json解析器,接收json的資料。這個要裝
logstash-codec-json_lines
- ouput elasticsearch指向我們安裝的位址
- stdout會列印收到的消息,調試用
./bin/logstash -f config/logstash-sample.conf
建立一個springboot項目
項目位址: https://github.com/Ryan-Miao/springboot-with-elk
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.test</groupId>
<artifactId>springboot-with-elk</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springboot-with-elk</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.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>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
建立啟動類
@SpringBootApplication
public class SpringbootWithElkApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(SpringbootWithElkApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
Logger logger = LoggerFactory.getLogger(SpringbootWithElkApplication.class);
logger.info("測試log");
for (int i = 0; i < 10; i++) {
logger.error("something wrong. id={}; name=Ryan-{};", i, i);
}
}
}
在resources下建立logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<root level="INFO">
<appender-ref ref="LOGSTASH" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>
啟動。然後就可以觀察到,logsash控制台列印我們的日志
{
"@version" => "1",
"thread_name" => "restartedMain",
"message" => "something wrong. id=9; name=Ryan-9;",
"logger_name" => "com.test.springbootwithelk.SpringbootWithElkApplication",
"level_value" => 40000,
"@timestamp" => 2018-05-26T15:21:05.109Z,
"host" => "localhost",
"level" => "ERROR",
"port" => 34902
}
在kibana- management - index pattern裡建立一個pattern,我們就用*吧。建立好了,點選discover。就可以看到我們的日志了
到這裡,hello world完成。當然還要繼續進階配置和查詢啥的,後面再說。
參考
關注我的公衆号
唯有不斷學習方能改變!
--
Ryan Miao