SpringBoot 接入輕量級分佈式日誌框架 GrayLog

大家好,我是不才陳某~

在微服務架構中,一個服務通常都會有多個實例,而這些服務實例可能會被部署到不同的機器或虛擬容器上。此時對於日誌數據的查看和分析就會變得困難起來,因爲這些服務的日誌數據都散落在各自實例所在的機器或容器上。例如,我現在要在訂單服務裏查找一個訂單 id 爲 1 的日誌,而訂單服務有 10 個實例並且部署在 10 臺不同的機器上,那麼我就得一臺臺的去找這個日誌數據。所以這時候我們就需要有一個可以實現日誌聚合的工具,將所有實例的日誌數據都聚合在一個地方,那麼我們就不需要到每個實例去找日誌了,而本文將使用的日誌聚合工具爲 Graylog

部署 Graylog

老樣子,直接上 docker-compose,如果一直跟着我的步伐,應該對着不陌生了。docker-compose.yml 的內容其實我也是抄官網的,這裏還是貼下吧(就不用你們翻了)

version: '3'
services:
    mongo:
      image: mongo:4.2
      networks:
        - graylog
    elasticsearch:
      image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
      environment:
        - http.host=0.0.0.0
        - transport.host=localhost
        - network.host=0.0.0.0
        - "ES_JAVA_OPTS=-Dlog4j2.formatMsgNoLookups=true -Xms512m -Xmx512m"
      ulimits:
        memlock:
          soft: -1
          hard: -1
      deploy:
        resources:
          limits:
            memory: 1g
      networks:
        - graylog
    graylog:
      image: graylog/graylog:4.2
      environment:
        - GRAYLOG_PASSWORD_SECRET=somepasswordpepper
        - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
        - GRAYLOG_HTTP_EXTERNAL_URI=http://ip:9009/ # 這裏注意要改ip
      entrypoint: /usr/bin/tini -- wait-for-it elasticsearch:9200 --  /docker-entrypoint.sh
      networks:
        - graylog
      restart: always
      depends_on:
        - mongo
        - elasticsearch
      ports:
        - 9009:9000
        - 1514:1514
        - 1514:1514/udp
        - 12201:12201
        - 12201:12201/udp
networks:
    graylog:
      driver: bridg

這個文件裏唯一需要改動的就是 ip (本來的端口是 9000 的,我由於已經佔用了 9000 端口了,所以我這裏把端口改成了 9009 ,你們可以隨意)

嗯,寫完 docker-compose.yml 文件,直接 docker-compose up -d 它就啓動起來咯。

啓動以後,我們就可以通過 ip:port 訪問對應的 Graylog 後臺地址了,默認的賬號和密碼是 admin/admin

隨後,我們配置下 inputs 的配置,找到 GELF UDP ,然後點擊 Launch new input ,只需要填寫 Title 字段,保存就完事了(其他不用動)。

Spring Boot 集成 GrayLog

首先創建一個 SpringBoot 項目,SpringBoot 默認自帶的日誌框架是 Logback,我們可以到 Graylog 組件市場查找 Logback 相應的組件。

添加依賴如下:

<dependency>
  <groupId>de.siegmar</groupId>
  <artifactId>logback-gelf</artifactId>
  <version>3.0.0</version>
</dependency>

接着在項目的 resources 目錄下,新建一個logback.xml文件,編輯文件內容如下:

<appender >
  <!-- Graylog服務的地址 -->
  <graylogHost>ip</graylogHost>
  <!-- UDP Input端口 -->
  <graylogPort>12201</graylogPort>
  <!-- 最大GELF數據塊大小(單位:字節),508爲建議最小值,最大值爲65467 -->
  <maxChunkSize>508</maxChunkSize>
  <!-- 是否使用壓縮 -->
  <useCompression>true</useCompression>
  <encoder class="de.siegmar.logbackgelf.GelfEncoder">
    <!-- 是否發送原生的日誌信息 -->
    <includeRawMessage>false</includeRawMessage>
    <includeMarker>true</includeMarker>
    <includeMdcData>true</includeMdcData>
    <includeCallerData>false</includeCallerData>
    <includeRootCauseData>false</includeRootCauseData>
    <!-- 是否發送日誌級別的名稱,否則默認以數字代表日誌級別 -->
    <includeLevelName>true</includeLevelName>
    <shortPatternLayout class="ch.qos.logback.classic.PatternLayout">
      <pattern>%m%nopex</pattern>
    </shortPatternLayout>
    <fullPatternLayout class="ch.qos.logback.classic.PatternLayout">
      <pattern>%d - [%thread] %-5level %logger{35} - %msg%n</pattern>
    </fullPatternLayout>

    <!-- 配置應用名稱(服務名稱),通過staticField標籤可以自定義一些固定的日誌字段 -->
    <staticField>app_name:austin</staticField>
  </encoder>
</appender>

在這個配置信息裏,唯一要改的也只是 ip 的地址,到這裏接入就完畢了,我們再打開控制檯,就能看到日誌的信息啦。

配置完成後啓動項目,啓動完成後正常情況下可以在 Graylog 的 Search 界面中查看日誌信息:

點擊一條日誌信息會展開詳細的字段:

以上是最簡單的日誌配置,如果希望對更多配置項進行自定義的話,可以參考該組件的 GitHub 文檔,上面有具體的配置項說明

現在我們已經成功將項目的日誌數據發送到了 Graylog 服務,如果我們想在 Graylog 上檢索日誌也很簡單,只需要使用一些簡單的語法即可,例如我要查詢包含 Mapping 的日誌信息:

還可以使用一些條件表達式,例如我要查詢 message 字段包含 http,並且日誌級別爲 INFO 的日誌信息:

常用的日誌搜索語法如下:

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/NbJ6MBwIKNCk2P9ek_pmhA