天天看點

ELK入門使用-與springboot內建

前言

ELK官方的

中文文檔

寫的已經挺好了,為啥還要記錄本文?因為我發現,我如果不寫下來,過幾天就忘記了,而再次撿起來必然還要經曆資料查找篩選測試的過程。雖然這個過程很有意義,但并不總是有那麼多時間去做。是以,接下來的内容僅僅是我根據查詢到的資料,篩選,組裝,測試後達到我的目标的一個過程。

什麼是ELK

K我最初還以為是Kafka,事實上,ELK平台是一個完整的日志分析解決方案,由這三個開源工具建構而成:Elasticsearch、Logstash、Kibana。

Elasticsearch用于深度搜尋和資料分析,它是基于Apache Lucene的分布式開源搜尋引擎,無須預先定義資料結構就能動态地對資料進行索引;

Logstash用于日志集中管理,包括從多台伺服器上傳輸和轉發日志,并對日志進行豐富和解析,是一個資料管道,提供了大量插件來支援資料的輸入和輸出處理;

最後是Kibana,提供了強大而美觀的資料可視化,Kibana完全使用HTML和Javascript編寫,它利用Elasticsearch 的RESTful API來實作其強大的搜尋能力,将結果顯示位各種震撼的圖形提供給最終的使用者。

ELK入門使用-與springboot內建

安裝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。就可以看到我們的日志了

ELK入門使用-與springboot內建

到這裡,hello world完成。當然還要繼續進階配置和查詢啥的,後面再說。

參考

    關注我的公衆号

ELK入門使用-與springboot內建

唯有不斷學習方能改變!

--

Ryan Miao