在微服務架構中,一個服務通常都會有多個實例,而這些服務實例可能會被部署到不同的機器或虛擬容器上。此時對于日志數據的查看和分析就會變得困難起來,因為這些服務的日志數據都散落在各自實例所在的機器或容器上。例如,我現在要在訂單服務里查找一個訂單id為1的日志,而訂單服務有10個實例并且部署在10臺不同的機器上,那么我就得一臺臺的去找這個日志數據。所以這時候我們就需要有一個可以實現日志聚合的工具,將所有實例的日志數據都聚合在一個地方,那么我們就不需要到每個實例去找日志了,而本文將使用的日志聚合工具為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/udpnetworks: 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 字段,保存就完事了(其他不用動)。
圖片
首先創建一個SpringBoot項目,SpringBoot默認自帶的日志框架是Logback,我們可以到 Graylog組件市場查找Logback相應的組件。
添加依賴如下:
<dependency> <groupId>de.siegmar</groupId> <artifactId>logback-gelf</artifactId> <version>3.0.0</version></dependency>
接著在項目的resources目錄下,新建一個logback.xml文件,編輯文件內容如下:
<appender name="GELF" class="de.siegmar.logbackgelf.GelfUdpAppender"> <!-- 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的日志信息:
圖片
常用的日志搜索語法如下:
本文鏈接:http://www.tebozhan.com/showinfo-26-86513-0.htmlELK太重?試試輕量級分布式日志框架GrayLog
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com