1. 程式人生 > >Logback+ELK+SpringMVC搭建日誌收集服務器

Logback+ELK+SpringMVC搭建日誌收集服務器

HA spring points ice 接口 eve bsp exe 路徑

(轉)

1.ELK是什麽?

ELK是由Elasticsearch、Logstash、Kibana這3個軟件的縮寫。

  • Elasticsearch是一個分布式搜索分析引擎,穩定、可水平擴展、易於管理是它的主要設計初衷
  • Logstash是一個靈活的數據收集、加工和傳輸的管道軟件
  • Kibana是一個數據可視化平臺,可以通過將數據轉化為酷炫而強大的圖像而實現與數據的交互將三者的收集加工,存儲分析和可視轉化整合在一起就形成了 ELK 。

2.ELK流程

ELK的流程應該是這樣的:Logback->Logstash->(Elasticsearch<->Kibana)

  1. 應用程序產生出日誌,由logback日誌框架進行處理。
  2. 將日誌數據輸出到Logstash中
  3. Logstash再將數據輸出到Elasticsearch中
  4. Elasticsearch再與Kibana相結合展示給用戶

3.ELK官網

https://www.elastic.co/guide/index.html
技術分享圖片

4. 環境配置

4.1 基礎環境

  • jdk 1.8
  • Centos 7.0 X86-64
    註意:ELK服務不能在root用戶開啟。需要重新創建用戶。
    下載ELK相關服務壓縮包
    創建ELK用戶和目錄並賦予權限,方便統一管理。
  1. [root@localhost /]# mkdir elsearch
  2. [root@localhost /]# groupadd elsearch
  3. [root@localhost /]# useradd -g elsearch elsearch
  4. [root@localhost /]# chown -R elsearch:elsearch /elsearch
  5. [root@localhost /]# su elsearch
  6. [elk@localhost /]$ cd elsearch

4.2 下載,然你也可以去官網找最新版的

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.2.tar.gz
wget https://artifacts.elastic.co/downloads/logstash/logstash-5.2.2.tar.gz
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.2.2-linux-x86_64.tar.gz

我這裏是以5.2.2為例來實現。

技術分享圖片

4.3 配置Elasticsearch

Elasticsearch是可以搭建集群,我這邊只是解壓後直接修改配置文件

elasticsearch.yml

  1. cluster.name: es_cluster_1
  2. node.name: node-1
  3. path.data: /usr/local/services/elasticsearch-5.2.2/data
  4. path.logs:/usr/local/services/elasticsearch-5.2.2/logs
  5. network.host: 192.168.10.200
  6. http.port: 9200

這裏有個問題:jvm.option.這個裏面設置的-xms和-xmx一定要註意,我自定義的都是512m。

啟動ElasticSearch,訪問http://192.168.10.200:9200/

技術分享圖片

看到如上的界面就代表啟動成功。

註意:安裝過程中出現一些問題。在這篇文章中已經都給我們解決了。
http://www.cnblogs.com/sloveling/p/elasticsearch.html

4.4 配置logstash

解壓

tar -zxvf /usr/local/services/logstash-5.2.2.tar.gz
  • 1

測試配置,只是測試服務是否啟動。還有這個文件是沒有的,啟動時加上這個路徑就是以這個配置啟動
vi /usr/local/services/logstash-5.2.2/config/logstash.conf

input {
 stdin { }
}
output {
 stdout {
 codec => rubydebug {}
 }
}

logstash以配置文件方式啟動有兩種:

  1. 列表內容 logstash -f logstash-test.conf //普通方式啟動
  2. logstash agent -f logstash-test.conf –debug//開啟debug模式
./bin/logstash -f ./config/logstash.conf --debug

啟動成功會看到如下的結果:
技術分享圖片

這是時候,我們在控制臺隨便輸入都可以被收集

n"=>"1", "host"=>"localhost", "message"=>"我們都是好好"}}
{
    "@timestamp" => 2017-08-18T05:45:25.340Z,
      "@version" => "1",
          "host" => "localhost",
       "message" => "我們都是好好"
}
[2017-08-18T13:45:26,933][DEBUG][logstash.pipeline        ] Pushing flush onto pipeline
[2017-08-18T13:45:31,934][DEBUG][logstash.pipeline        ] Pushing flush onto pipeline

4.5 配置logstash

配置kibana
+ 解壓

[elsearch@localhost root]$ tar -zxvf /usr/local/services/kibana-5.2.2-linux-x86_64.tar.gz

打開配置
[elsearch@localhost root]$ vim /usr/local/services/kibana-5.2.2-linux-x86_64/config/kibana.yml

修改配置,最後最加

  1. server.port: 8888
  2. server.host: "192.168.10.200"
  3. elasticsearch.url: "http://192.168.10.200:9200"

啟動

[elsearch@localhost root]$ /usr/local/services/kibana-5.2.2-linux-x86_64/bin/kibana &

訪問地址 http://192.168.10.200:8888

技術分享圖片

基本ELK的環境的搭建就ok了,我們接下來學習logback-ELK整合來收集JavaEE中的日誌。

4.6 logback-ELK整合

4.6.1 本案列采用maven管理

pom.xml

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>4.11</version>
</dependency>
        <!--實現slf4j接口並整合-->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>
    <dependency>
<groupId>net.logstash.log4j</groupId>
<artifactId>jsonevent-layout</artifactId>
<version>1.7</version>
</dependency>

4.6.2配置logaback的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定義日誌文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
    <property name="LOG_HOME" value="E:/logs" />
    <!-- 控制臺輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日誌文件 -->
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日誌文件輸出的文件名-->
            <FileNamePattern>${LOG_HOME}/TestWeb.log_%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日誌文件保留天數-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日誌消息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日誌文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
    <!-- show parameters for hibernate sql 專為 Hibernate 定制 -->
    <logger name="org.hibernate.type.descriptor.sql.BasicBinder"  level="TRACE" />
    <logger name="org.hibernate.type.descriptor.sql.BasicExtractor"  level="DEBUG" />
    <logger name="org.hibernate.SQL" level="DEBUG" />
    <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
    <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />

    <!--myibatis log configure-->
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    <appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>192.168.10.200:8082</destination>
        <!-- encoder is required -->
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>
    <!-- 日誌輸出級別 -->
    <root level="INFO">
         <!-- 只有添加stash關聯才會被收集-->
        <appender-ref ref="stash" />
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

註意:logstash接收日誌的地址 192.168.10.200:8082

4.6.3配置logstash-test.conf

vi logstash-test.conf

input {
 tcp {
        host => "192.168.10.200"
        port => 8082
        mode => "server"
        ssl_enable => false
        codec => json {
            charset => "UTF-8"
        }
    }
}
output {
    elasticsearch {
    hosts => "192.168.10.200:9200"
    index => "logstash-test"
    }
  stdout { codec => rubydebug {} }
}

啟動收集

./bin/logstash -f config/logstash-test.conf –debug

4.6.4配置Controller添加日誌輸出

package com.example.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestEndpoints {
    private final static Logger logger = LoggerFactory.getLogger(TestEndpoints.class);

    @GetMapping("/product/{id}")
    public String getProduct(@PathVariable String id) {
        String data = "{\"name\":\"李東\"}";
        logger.info(data);
        return "product id : " + id;
    }

    @GetMapping("/order/{id}")
    public String getOrder(@PathVariable String id) {

        return "order id : " + id;

    }
}

請求調用之後控制臺的log

技術分享圖片

之後Kibana中就可以收集到log

{
  "_index": "logstash-test",
  "_type": "logs",
  "_id": "AV3zu4jiJKLF9tWSjmZj",
  "_score": null,
  "_source": {
    "@timestamp": "2017-08-18T05:04:51.698Z",
    "level": "INFO",
    "port": 56525,
    "thread_name": "http-nio-8081-exec-10",
    "level_value": 20000,
    "@version": 1,
    "host": "192.168.10.165",
    "logger_name": "com.example.demo.TestEndpoints",
    "message": "{\"name\":\"李東\"}"
  },
  "fields": {
    "@timestamp": [
      1503032691698
    ]
  },
  "sort": [
    1503032691698
  ]
}

技術分享圖片

Logback+ELK+SpringMVC搭建日誌收集服務器