ES系列十7、logback+ELK日誌搭建

1、ELK應用場景

在複雜的企業應用服務羣中,記錄日誌方式多種多樣,而且不易歸檔以及提供日誌監控的機制。不管是開發人員仍是運維人員都沒法準確的定位服務、服務器上面出現的種種問題,也沒有高效搜索日誌內容從而快速定位問題的方式。所以須要一個集中式、獨立的、蒐集管理各個服務和服務器上的日誌信息,集中管理,並提供良好的UI界面進行數據展現,處理分析。html

得此:ELK提供一套開源的解決方案,能高效、簡便的知足以上場景。java

2、ELK日誌系統介紹

一、ELK分別是Elasticsearch、Logstash、Kibana三個開源框架縮寫。

框架 簡介 做用
Elasticsearch 開源分佈式搜索引擎,提供存儲、分析、搜索功能。特色:分佈式、基於reasful風格、支持海量高併發的準實時搜索場景、穩定、可靠、快速、使用方便等。 接收蒐集的海量結構化日誌數據,並提供給kibana查詢分析
Logstash 開源日誌蒐集、分析、過濾框架,支持多種數據輸入輸出方式。 用於收集日誌,對日誌進行過濾造成結構化數據,並轉發到elasticsearch中
Kibana 開源日誌報表系統,對elasticsearch以及logstash有良好的web頁面支持。 對elasticsearch提供的數據進行分析展現

二、與Logstash的直接集成有兩種方式:

2.一、Logstash與微服務應用安裝在一塊兒,監聽日誌文件

2.二、Logstash獨立部署,微服務節點經過網絡向Logstash發送日誌信息。

三、間接集成(兩種方式)

一、每一個應用節點部署一個輕量級日誌採集框架Beats,再由Beats對接統一的Logstash

因爲Logstash消耗資源大,而服務器資源至關寶貴,因此引進另外一個輕量級日誌採集框架Beats,其中包含如下6種node

Packetbeat 用於蒐集網絡流量數據

Heartbeatlinux

用於運行時間監控
Filebeat 用於蒐集文件數據
Winlogbeat 用於蒐集winodws事件數據
Metricbeat 用於指標
Auditbeat 用於審計數據

 

 

二、微服務將日誌發送給Redis或者MQ,再由他們去對接Logstash(高併發場景)

因爲logstash消耗性能,因此高併發場景容易遇到流量上的瓶頸,及時使用logstash集羣也是如此,因此能夠添加中間件進行日誌緩存處理。因爲logstash數據源具備多種方式,全部中間件也能夠不少選擇,常見的有kafka,redis。web

3、ELK搭建(非集羣)

一、下載ELK(保持版本一致)

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

三、安裝Kibana

一、解壓到安裝目錄便可緩存

 

/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啓動

四、安裝logstash

一、下載

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]# 

命令說明:

  • --path.settings 用於指定logstash的配置文件所在的目錄
  • -f 指定須要被檢測的配置文件的路徑
  • --config.test_and_exit 指定檢測完以後就退出,否則就會直接啓動了

四、指定配置文件,啓動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 ~]# 

五、配置lockback

一、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());
    }
}  

執行:

 

四、驗證

相關文章
相關標籤/搜索