使用docker-elk搭建並實踐ELK日誌分析框架

1. ELK日誌分析簡介

1.1 ELK日誌分析概述

  ELK可運行於分佈式系統之上,經過蒐集、過濾、傳輸、儲存,對海量系統和組件日誌進行集中管理和準實時搜索、分析,使用搜索、監控、事件消息和報表等簡單易用的功能,幫助運維人員進行線上業務的準實時監控、業務異常時及時定位緣由、排除故障、程序研發時跟蹤分析Bug、業務趨勢分析、深度挖掘日誌的大數據價值。ELK主要可解決的問題以下:1.日誌查詢,問題排查,上線檢查.2.服務器監控,應用監控,錯誤報警,Bug管理. 3.性能分析,安全漏洞分析。綜上,ELK是一套方便、易用的日誌分析開源解決方案。
前端

1.2 ELK主要組件介紹

  生產環境中,ELK一般由如下4個組件構成:java

1.2.1 ElasticSearch組件

  ElasticSearch是一個基於Lucene的開源分佈式搜索服務器。它的特色有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並做爲Apache許可條款下的開放源碼發佈,是第二流行的企業搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。linux

1.2.2 Logstash組件

  Logstash是一個徹底開源的工具,它能夠對你的日誌進行收集、過濾、分析,支持大量的數據獲取方法,並將其存儲供之後使用(如搜索)。通常工做方式爲c/s架構,client端安裝在須要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操做在一併發往elasticsearch上去。Logstash事件處理有三個階段:inputs → filters → outputs。是一個接收,處理,轉發日誌的工具,以下圖所示:
git

1.2.3 Kibana組件

  Kibana是一個基於瀏覽器頁面的Elasticsearch前端展現工具,也是一個開源和免費的工具,Kibana能夠爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,能夠幫助您彙總、分析和搜索重要數據日誌。github

1.2.4 Filebeat組件

  Filebeat是一個日誌文件託運工具,在你的服務器上安裝客戶端後,filebeat會監控日誌目錄或者指定的日誌文件,追蹤讀取這些文件,而且轉發這些信息到賦予他的輸出位置(常見如elasticsearch、kafka或logstarsh)中存放。Filebeat等同於一個輕量級的logstash,當你須要收集信息的機器配置或日誌資源數量不是特別多時,最佳實踐是使用filebeat來代替logstash收集日誌,filebeat十分小巧且穩定。下圖是filebeat的工做流程:當你開啓filebeat程序的時候,它會啓動一個或多個探測器(prospectors)去檢測你指定的日誌目錄或文件,對於探測器找出的每個日誌文件,filebeat啓動收割進程(harvester),每個收割進程讀取一個日誌文件的新內容,併發送這些新的日誌數據處處理程序(spooler),處理程序會集合這些事件,最後filebeat會發送集合的數據到你指定的地點。
web

2. Docker-elk搭建實驗環境

2.1 sebp/elk鏡像的獲取

  外網環境下,執行命令:docker pull sebp/elk 將鏡像pull到本地來。正則表達式

2.2 製做上報日誌到ELK的filebeat鏡像

(1) 本地Window在官網下載filebeat,而後經過SecureCRT導入tar.gz壓縮包文件並在linux中解壓。
spring

(2) 安裝JDK 鏡像
  與elk鏡像同理,將JDK的官方鏡像pull到本地,做爲基礎鏡像就好:java:8u111-jdk .
(3) 開放filebeat訪問ELK的權限
  在咱們使用的elk鏡像源碼的git倉庫中(地址是https://github.com/spujadas/elk-docker),下載該鏡像的logstash-beats.crt文件來給filebeat提供受權,製做鏡像時要放在指定目錄下。
docker

(4) 修改配置文件filebeat.yml
  首先配置抓取WEB日誌的目錄:shell

- type: log
      # Change to true to enable this prospector configuration.
      enabled: true
      # Paths that should be crawled and fetched. Glob based paths.
      paths:
    - /applog/*.log

  接下來爲filebeat提供ELK受權:

#output.logstash:
      # The Logstash hosts
      hosts: ["localhost:5044"]
      # Optional SSL. By default is off.
      # List of root certificates for HTTPS server verifications
      ssl.certificate_authorities: ["/home/hik/docker/logstash-beats.crt"]

(5) 製做filebeat和web服務的啓動腳本
  編寫啓動filebeat和web應用的腳本filebeat-springboot-entrypoint.sh,在docker容器啓動的時候執行,這樣就能讓fliebeat和web應用在容器啓動後也自動啓動了:

echo "start filebeat now ..."
nohup /opt/filebeat-6.2.2-linux-x86_64/filebeat -e -c /opt/filebeat-6.2.2-linux-x86_64/filebeat.yml >/dev/null 2>&1 &
echo "start springboot jar now ..."
java -jar $1

(6) 經過Dockerfile完成filebeat鏡像構建
  Dockerfile腳本的內容以下:

#基礎鏡像
FROM java:8u111-jdk

#定義日誌文件存放目錄,這個要和web應用的日誌配置一致
ENV APP_LOG_PATH /applog

#定義證書文件目錄,這個要和filebeat.yml的配置一致
ENV FILE_BEAT_CRT_PATH /etc/pki/tls/certs

#定義filebeat文件夾名稱
ENV FILE_BEAT_PACKAGE_NAME filebeat-6.2.2-linux-x86_64

#定義證書文件名稱
ENV FILE_BEAT_CRT_NAME logstash-beats.crt

#定義啓動文件名稱
ENV ENTRYPOINT_FILE_NAME filebeat-springboot-entrypoint.sh

#定義時區參數
ENV TZ=Asia/Shanghai

#設置時區
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

#使之生效
RUN . /etc/profile

#建立日誌目錄文件夾
RUN mkdir $APP_LOG_PATH

#存放證書的文件夾
RUN mkdir -p $FILE_BEAT_CRT_PATH

#從當前目錄將證書文件複製到鏡像中
COPY ./$FILE_BEAT_CRT_NAME $FILE_BEAT_CRT_PATH/

#從當前目錄將filebeat文件複製到鏡像中
COPY ./$FILE_BEAT_PACKAGE_NAME /opt/$FILE_BEAT_PACKAGE_NAME

#複製啓動文件
COPY ./$ENTRYPOINT_FILE_NAME /$ENTRYPOINT_FILE_NAME

#賦寫權限
RUN chmod a+x /$ENTRYPOINT_FILE_NAME

  如上所述,前面咱們準備的材料在腳本都通通用上了;將filebeat-6.2.2-linux-x86_64 文件夾、Dockerfile文件、filebeat-springboot-entrypoint.sh文件、logstash-beats.crt放在同一目錄下,執行如下命令便可將鏡像構建成功:

docker build -t springboot-app-filebeat:0.0.3 .

  注意:最後有一個空格和一個點,這表明當前路徑,不加的話會構建失敗。

2.3 經過2.2製做web工程鏡像

(1) 用maven建立一個springboot的web工程,在工程的目錄src/main/resources下增長一個logback.xml文件,用於配置日誌有關的參數。日誌文件的目錄設置在/applog/,和filebeat.yml中搜集日誌的目錄保持一致(完成)

<!-- 文件日誌:輸出所有日誌到文件 -->
<appender name="FILE"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>/applog/output.%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>7</maxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>${ENCODER_PATTERN}</pattern>
    </encoder>
</appender>

(2) 在web工程的pom.xml中,新增一個插件docker-maven-plugin,用於將當前工程構建成的jar作成docker鏡像文件,基礎鏡像使用2.2中構建好的filebeat鏡像。

<!--新增的docker maven插件-->
<plugin>
   <groupId>com.spotify</groupId>
   <artifactId>docker-maven-plugin</artifactId>
   <version>0.4.12</version>
   <!--docker鏡像相關的配置信息-->
   <configuration>
      <!--鏡像名,這裏用工程名-->
      <imageName>bolingcavalry/${project.artifactId}</imageName>
      <!--TAG,這裏用工程版本號-->
      <imageTags>
         <imageTag>${project.version}</imageTag>
      </imageTags>
      <!--鏡像的FROM,使用springboot-app-filebeat:0.0.3-->
      <baseImage>springboot-app-filebeat:0.0.3</baseImage>
      <!--該鏡像的容器啓動後,直接運行spring boot工程-->
      <entryPoint>["sh","/filebeat-springboot-entrypoint.sh","/${project.build.finalName}.jar"]</entryPoint>
      <!--構建鏡像的配置信息-->
      <dockerHost>http://10.66.35.173:2375</dockerHost>
      <resources>
         <resource>
            <targetPath>/</targetPath>
            <directory>${project.build.directory}</directory>
            <include>${project.build.finalName}.jar</include>
         </resource>
      </resources>
   </configuration>
</plugin>

(3) 新增HelloController.java用於響應web請求,而且每次收到請求時都會打印一行日誌到指定文件中。

@RequestMapping(value="/hello/{username}",method= RequestMethod.GET)
public String hello(@PathVariable String username) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String time = sdf.format(new Date());
    logger.info("execute hello from {} - {}", username, time);
    return "hello " + username + ", " + time;
}

(4) 在pom.xml文件所在目錄執行如下命令,便可編譯構建當前工程,並製做成docker鏡像:shell mvn clean package -U -DskipTests docker:build

2.4 鏈接2.1和2.3實現ELK管理WEB服務

  經過docker-compose.yml來啓動ELK和最終鏡像。完成二者的鏈接,使web工程在ELK容器中運行。

vi docker-compose.yml

version: '2'
services:
  elk:
    image: elk:6.4.2
    ports:
      - "5601:5601"
      - "9200:9200"
    restart: always
  webapp:
    image: elkdemo:1.0
    depends_on:
      - elk
    links:
      - elk:elkhost
    ports:
      - "18080:8080"
restart: always

啓動:shell sudo docker-compose up -d

注意:1.ELK server容器的5601端口映射爲當前電腦的5601端口,用於訪問kibana;2.web應用鏡像使用link參數綁定ELK server容器,3使用webapp做爲域名的地方都會被解析爲ELK server容器的IP地址;3.web容器的8080映射爲當前電腦的18080端口,訪問當前電腦的18080端口便可訪問web服務。

  至此,整個ELK環境所需的鏡像和腳本都已作好,web服務和ELK服務也都成功運行起來了,實驗環境搭建完畢。

3. Logstash與filter插件應用

3.1 Logstash經常使用filter插件

  Filter是Logstash功能強大的主要緣由,它能夠對Logstash Event進行豐富的處理,好比說解析數據、刪除字段、類型轉換等等,常見的有以下幾個:

(1)date: 日誌解析,從字段解析日期以用做事件的Logstash時間戳。
(2)grok:正則匹配解析。將非結構化事件數據分析到字段中。 這個工具很是適用於系統日誌,Apache和其餘網絡服務器日誌,MySQL日誌,以及一般爲人類而不是計算機消耗的任何日誌格式。
(3)dissect:分割符解析。基於分隔符原理解析數據,解決grok解析時消耗過多cpu資源的問題,使用分隔符將非結構化事件數據提取到字段中。解剖過濾器不使用正則表達式,速度很是快。 可是,若是數據的結構因行而異,grok過濾器更合適。dissect的應用有必定的侷限性:主要適用於每行格式類似且分隔符明確簡單的場景 。
(4)mutate:對字段作處理,好比重命名、刪除、替換等。
(5)json:按照json解析字段內容到指定字段中。
(6)geoip:增長地理位置數據。根據ip地址提供對應的地域信息,好比經緯度、城市名等,方便進行地理數據分析。

3.2 Logstash日誌過濾實踐

(1) 修改filebeat.yml文件,將filebeat的輸出從elasticsearch改成logstash:

#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  # Array of hosts to connect to.
  # hosts: ["localhost:9200"]   #註釋掉這句,filebeat再也不輸出到elasticsearch,改成向logstash輸出

  # Optional protocol and basic auth credentials.
  #protocol: "https"
  #username: "elastic"
  #password: "changeme"

#----------------------------- Logstash output --------------------------------
#output.logstash:
  # The Logstash hosts
  hosts: ["localhost:5044"]

  # Optional SSL. By default is off.
  # List of root certificates for HTTPS server verifications
  ssl.certificate_authorities: ["/home/hik/docker/logstash-beats.crt"]

(2) 查看正在運行中的容器,找到ELK容器elk:6.4.2

hik@root:~/docker/filebeat-6.2.2-linux-x86_64$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                NAMES
c02f0f0f6047        elkdemo:1.0         "sh /filebeat-spring…"   8 weeks ago         Up About an hour    0.0.0.0:18080->8080/tcp                                              docker_webapp_1
308de13c21e0        elk:6.4.2           "/usr/local/bin/star…"   8 weeks ago         Up About an hour    0.0.0.0:5601->5601/tcp, 5044/tcp, 9300/tcp, 0.0.0.0:9200->9200/tcp   docker_elk_1

(3) 進入ELK容器: sudo docker exec –it /bin/bash ,此處的container-name爲308de13c21e0

hik@root:~/docker/filebeat-6.2.2-linux-x86_64$ sudo docker exec -it 308de13c21e0 /bin/bash
root@308de13c21e0:/# ls
bd_build  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

(4) 修改/opt/logstash/config路徑下的logstash-sample.conf,增長JSON過濾插件

#本操做使用json插件,處理結果刪除掉message字段。
input {
  beats {
    port => 5044
  }
}
filter {
    json {
        source => "message"
        remove_field => ["message"]
    }
}
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

(5) 經過配置文件來啓動logstash,若出現端口占用須要先殺掉此前佔用5044端口的進程:

bin/logstash -f logstash-sample.conf

(6) 處理結果爲

{
  "_index": "filebeat-2019.05.22",
  "_type": "doc",
  "_id": "CnCs3WoBtWWwz0jz3Y4z",
  "_version": 1,
  "_score": null,
  "_source": {
    "beat": {
      "name": "be58d50b9f23",
      "hostname": "be58d50b9f23",
      "version": "6.2.2"
    },
    "tags": [
      "beats_input_codec_plain_applied"
    ],
    "@version": "1",
    "source": "/applog/output.2019-05-22.log",
    "@timestamp": "2019-05-22T03:53:09.901Z",
    "offset": 2722,
    "prospector": {
      "type": "log"
    },
    "host": "be58d50b9f23"
  },
  "fields": {
    "@timestamp": [
      "2019-05-22T03:53:09.901Z"
    ]
  },
  "sort": [
    1558497189901
  ]
}

4. 小結

  本文首先簡單介紹了ELK日誌分析的整體框架和重要組件,接下來經過docker-elk完成了日誌分析平臺的實驗環境搭建,最後對logstash和它的filter插件作了簡單介紹和實驗驗證。後續會繼續研究ELK的配置優化和插件運用,爲後續ELK集成的WEB打好基礎。

相關文章
相關標籤/搜索