1. 簡介
Graylog 是一款日誌聚合服務。 簡單來説,它能夠從多個來源收集數百萬條日誌消息,並在單個界面上進行展示。
它還提供了一系列其他功能,例如實時告警、帶有圖表和曲線的儀表板,以及更多。
在本教程中,我們將學習如何設置 Graylog 服務器並從 Spring Boot 應用程序向其中發送日誌消息。
2. 設置 Graylog
有幾種方法可以安裝和運行 Graylog。在本教程中,我們將討論兩種最快捷的方法:Docker 和 Amazon Web Services。
2.1. Docker
以下命令將下載所有必需的 Docker 鏡像,併為每個服務啓動一個容器:
$ docker run --name mongo -d mongo:3
$ docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e ES_JAVA_OPTS="-Xms2g -Xmx4g" \
-e "discovery.type=single-node" -e "xpack.security.enabled=false" \
-e "bootstrap.memory_lock=true" --ulimit memlock=-1:-1 \
-d docker.elastic.co/elasticsearch/elasticsearch:5.6.11
$ docker run --name graylog --link mongo --link elasticsearch \
-p 9000:9000 -p 12201:12201 -p 514:514 -p 5555:5555 \
-e GRAYLOG_WEB_ENDPOINT_URI="http://127.0.0.1:9000/api" \
-d graylog/graylog:2.4.6-1Graylog儀表板現在可通過以下 URL 訪問:http://localhost:9000/,默認用户名和密碼均為 admin。
雖然 Docker 設置是最簡單的,但它需要大量的內存。它也不支持 Docker for Mac,因此可能不適用於所有平台。
2.2. 亞馬遜雲服務
使用亞馬遜雲服務設置 Graylog 進行測試是最簡單的選項。 Graylog 提供了一個官方 AMI,其中包含所有必需的依賴項,儘管安裝後仍需要進行一些額外的配置。
我們可以快速部署一個 EC2 實例,使用 Graylog AMI 在特定區域。 Graylog 建議使用至少 4GB 內存的實例。
在實例啓動後,我們需要通過 SSH 登錄主機並進行一些更改。 以下命令將配置 Graylog 服務:
$ sudo graylog-ctl enforce-ssl
$ sudo graylog-ctl set-external-ip https://<EC2 PUBLIC IP>:443/api/
$ sudo graylog-ctl reconfigure我們還需要更新與 EC2 實例創建的安全組,以允許在特定端口上進行網絡流量。 下圖顯示了需要啓用的端口和協議:
Graylog 儀表板現在可通過 URL https://
2.3. 其他 Graylog 安裝
除了 Docker 和 AWS 之外,還有針對各種操作系統的 Graylog 包。採用這種方法,我們還需要設置 ElasticSearch 和 MongoDB 服務。
因此,Docker 和 AWS 在設置方面更加容易,尤其是在開發和測試目的方面。
3. 將日誌消息發送到 Graylog
啓動 Graylog 後,我們需要配置我們的 Spring Boot 應用程序,以便將日誌消息發送到 Graylog 服務器。
任何 Java 日誌框架都可以使用 GELF 協議將消息發送到 Graylog 服務器。
3.1. Log4J
目前唯一官方支持的日誌框架是 Log4J。 Graylog 提供了一個 Appender,可在 Maven 中央倉庫 中找到。
我們可以通過在任何 pom.xml 文件中添加以下 Maven 依賴來啓用它:
<dependency>
<groupId>org.graylog2</groupId>
<artifactId>gelfj</artifactId>
<version>1.1.16</version>
</dependency>我們還需要排除在任何使用 Spring Boot starter 模塊的地方使用 logging starter 模塊:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>現在,我們可以定義一個新的appender在我們的 log4j.xml文件中:
<appender name="graylog" class="org.graylog2.log.GelfAppender">
<param name="graylogHost" value="<GRAYLOG IP>"/>
<param name="originHost" value="localhost"/>
<param name="graylogPort" value="12201"/>
<param name="extractStacktrace" value="true"/>
<param name="addExtendedInformation" value="true"/>
<param name="facility" value="log4j"/>
<param name="Threshold" value="INFO"/>
<param name="additionalFields" value="{'environment': 'DEV', 'application': 'GraylogDemoApplication'}"/>
</appender>這將配置所有 INFO 級別或更高等級的日誌消息,使其發送到 Graylog 應用器,後者再將日誌消息發送到 Graylog 服務器。
3.2. 其他日誌框架
Graylog 市場(Graylog marketplace)提供了支持多種其他日誌框架的額外庫,例如 Logback、Log4J2 等。請注意,這些庫並非由 Graylog 維護。其中一些已經廢棄,另一些則缺乏文檔或文檔非常有限。
在依賴這些第三方庫時,務必謹慎。
3.3. Graylog 收集器側載 (Graylog Collector Sidecar)
另一個日誌收集選項是 Graylog 收集器側載。 側載是一個運行在文件收集器旁邊的進程,將日誌文件內容發送到 Graylog 服務器。
側載在應用程序無法更改日誌配置文件的場景中是一個不錯的選擇。 並且因為它直接從磁盤讀取日誌文件,因此它也可以用於從任何平台和編程語言集成日誌消息。
4. 在 Graylog 中查看消息
我們可以使用 Graylog 面板來確認我們的日誌消息已成功交付。 通過使用過濾器 source:localhost,將顯示來自我們示例 log4j 配置的日誌消息:
5. 結論
Graylog 只是眾多日誌聚合服務中的一個。它能夠快速搜索數百萬條日誌消息,實時可視化日誌數據,並在滿足特定條件時發送警報。
將 Graylog 集成到 Spring Boot 應用程序中只需幾行配置,並且無需編寫任何新代碼。