從 Spring Boot 將即時日誌串流傳輸到 Splunk
1. 概述
在本教程中,我們將分解使用 HTTP 事件收集器 (HEC) 將即時日誌從 Spring Boot 應用程式直接串流到 Splunk 的步驟。首先,我們將使用一個簡單的 XML 檔案來配置 Spring Boot 端的所有內容,以建立日誌和 Splunk 之間的連線。此外,我們將使用log4j2
進行此設置,因為它是一個流行且相容的日誌記錄框架,可與 Splunk 無縫整合。
2.什麼是Splunk?
Splunk 是一個很棒的工具,用於監視、搜尋和視覺化機器產生的資料。它不僅對於索引和連接即時數據非常有效,而且還使我們能夠創建具有引人入勝的視覺化效果的儀表板以進行無縫監控。此外,Splunk 還提供了一系列用戶友好的搜尋命令,甚至還包括自己的用於進階查詢的搜尋處理語言 (SPL)。
3.設定 Splunk
我們可以透過導航到 URL: Splunk Enterprise 來下載它。我們可以前往我的儀表板(右上角)-> Splunk Enterprise(向下捲動)-> 下載(針對我們的特定作業系統)。
我們在安裝過程中要記下**使用者名稱和密碼**。
3.1.配置 Splunk 以取得 Splunk 日誌
讓我們在 Splunk 中建立一個索引,以便我們可以在 Spring Boot 中使用這些憑證來引導其中的日誌。我們可以導航到“設定”(右上角)->“資料輸入”->“HTTP 事件收集器”,如下所示:
我們將首先建立一個唯一的令牌來安全地將資料傳送到 Splunk。此令牌不僅有助於對資料來源進行身份驗證,還可以在資料攝取 Splunk 時追蹤和控制對資料的存取。因此,讓我們點擊「新令牌」(右上角),然後輸入以下詳細資訊:
命名來源
這裡「名稱」是令牌組中令牌的唯一標識符,「來源名稱覆蓋」有助於根據資料來源對資料進行分類,Splunk 使用它來確定如何索引和搜尋我們的資料。
接下來,我們必須點擊“選擇”並在下拉清單中選擇“Log4j”,因為我們將在 Spring Boot 端使用它。
選擇 Log4j
我們必須建立一個索引來優化資料的排序和查詢方式。值得注意的是,該索引將優先於來源名稱,預設情況下,來源名稱用作特定令牌的預設設定。因此,讓我們點擊“建立新索引”並給出一個有意義的“索引名稱”。我們可以將其他欄位保留為預設值,然後按一下「儲存」。
建立索引
命名索引
讓我們檢查一下並點擊“提交”。同樣,我們必須記下新建立的行中的標記。
3.2.配置全域設定
首先,我們導航到“設定”(右上角)->“資料輸入”->“HTTP 事件收集器”,然後點擊“全域設定”按鈕(右上角)。接下來,我們需要更新所有屬性,如下所示:
所有令牌: Enabled
預設來源類型: JSON
預設索引: student_api_dev
我們還必須記下 HTTP 連接埠號,其他內容保持默認,然後按一下「儲存」。
基於“預設索引”,如果我們不指定索引,Splunk將自動將事件指派給student_api_dev
索引。 「啟用所有令牌」使 Splunk 活動以接收包含我們建立的所有令牌的日誌。
4.從Spring Boot發送日誌到Splunk
4.1. Maven 依賴項
讓我們使用以下資訊更新儲存庫標籤:
<repository>
<id>splunk-artifactory</id>
<name>Splunk Releases</name>
<url>https://splunk.jfrog.io/splunk/ext-releases-local</url>
</repository>
由於 Spring Web Starter 預設包含[spring-boot-starter-logging](https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-logging)
,因此我們需要明確排除它以在後續步驟中包含log4j
。
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
同樣,我們也必須將其從spring-boot-starter-test
中排除。
我們需要Splunk-library-javalogging
,
完成所有與 Splunk 相關的設定:
<dependency>
<groupId>com.splunk.logging</groupId>
<artifactId>splunk-library-javalogging</artifactId>
<version>${splunk-logging.version}</version>
</dependency>
我們的日誌將使用log4j2
生成,因此我們還需要:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency> </dependencies>
4.2.新增控制器類
我們將建立一個RestController.java
文件,在其中實作三種類型的 API 端點:首先,新增學生;接下來,檢索所有學生;最後,透過rollNumber
取得學生:
@PostMapping
public Student addStudent(@RequestBody Student student) {
return studentService.addStudent(student);
}
@GetMapping
public List<Student> getStudents() {
return studentService.getStudents();
}
@GetMapping("{rollNumber}")
public Student getStudent(@PathVariable("rollNumber") int rollNumber) {
return studentService.getStudent(rollNumber);
}
4.3.新增模型和服務類
讓我們建立Student.java
,我們將使用 POJO 來表示Student
物件:
public class Student {
private String name;
private int rollNumber;
public Student() {
}
// standard getters, setters, toString(), equals() and hashCode()
}
StudentService.java
是執行與學生相關的所有操作的類別。我們還有一個記錄器,它也會在控制台中列印日誌,而這些日誌也會以相同的格式傳送到 Splunk :
@Service
public class StudentService {
private static final Logger logger = LogManager.getLogger(StudentService.class);
private final List<Student> students = new ArrayList<>();
}
具體來說,它包括三個方法來支援控制器類別中三個不同的對應 API:
public Student addStudent(Student student) {
logger.info("addStudent: adding Student");
logger.info("addStudent: Request: {}", student);
students.add(student);
logger.info("addStudent: added Student");
logger.info("addStudent: Response: {}", student);
return student;
}
public List<Student> getStudents() {
logger.info("getStudents: getting Students");
List<Student> studentsList = students;
logger.info("getStudents: got Students");
logger.info("getStudents: Response: {}", studentsList);
return studentsList;
}
public Student getStudent(int rollNumber) {
logger.info("getStudent: getting Student");
logger.info("getStudent: Request: {}", rollNumber);
Student student = students.stream().filter(stu -> stu.getRollNumber() == rollNumber)
.findAny().orElseThrow(() -> new RuntimeException("Student not found"));
logger.info("getStudent: got Student");
logger.info("getStudent: Response: {}", student);
return student;
}
4.4.新增 Splunk 日誌記錄的設定文件
以下文件必須遵守特定的命名約定,以便 Spring Boot 可以自動識別它:
[logging-framework]-spring.xml
讓我們用我們現在使用的日誌框架的名稱來替換方括號內的部分。例如:
log4j2-spring.xml
現在,讓我們將該檔案放置在 Spring Boot 專案的 resources 資料夾中。透過這樣做,Spring Boot 將自動偵測並載入它:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout
pattern="%style{%d{ISO8601}} %highlight{%-5level }[%style{%t}{bright,blue}]
%style{%C{10}}{bright,yellow}: %msg%n%throwable"/>
</Console>
<SplunkHttp
name="splunkhttp"
url="http://localhost:8088"
token="11806291-7e0e-422a-a083-abfdd4b2eb74"
host="localhost"
index="student_api_dev"
type="raw"
source="student-http-events"
sourcetype="log4j"
messageFormat="text"
disableCertificateValidation="true">
<PatternLayout pattern="%m"/>
</SplunkHttp>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="console"/>
<AppenderRef ref="splunkhttp"/>
</Root>
</Loggers>
</Configuration>
讓我們試著理解上面的文件:
-
**Appenders**
:此部分指定日誌傳送目的地的詳細資訊。 -
**Console**
:常用的附加程序,將日誌傳送到控制台。 -
**PatternLayout**
:這定義了附加程式應如何格式化日誌,指定要包含哪些訊息,例如時間戳記、等級、訊息等。 -
**SplunkHttp**
:此附加程式提供必要的詳細信息,例如 Splunk 伺服器的位址和我們的 Splunk 令牌,以及其他連接細節。 -
**Loggers**
:它們用作過濾器,確定應記錄的內容。
4.5.在 Splunk 中填充日誌
現在讓我們運行我們的應用程式。一旦它啟動並運行,我們就可以向我們的 API 發送請求。之後,我們可以返回 Splunk 並執行以下查詢:
index="student_api_dev"
因此,我們將觀察到與下面的螢幕截圖類似的所有日誌。
5. 結論
Splunk 是一款強大的即時數據監控、搜尋和視覺化工具,非常適合追蹤機器產生的數據。其可擴展性確保它能夠有效地處理不斷增長的資料量,而其搜尋處理語言 (SPL) 則提供了複雜查詢所需的靈活性。此外,該平台的即時更新與基於角色的存取控制(RBAC)和先進索引系統等安全功能相結合,進一步增強了其快速、安全的資料分析能力。
當與 Spring Boot 應用程式整合時,Splunk 簡化了日誌的攝取、分析和視覺化流程,為生產環境中主動解決問題提供有價值的見解和警報。
本文的源代碼可在 GitHub 上取得。