Java實(shí)現(xiàn)日志文件關(guān)鍵詞搜索方式
Java日志文件關(guān)鍵詞搜索
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class TryTraverseDemo03 {
public static void main(String[] args) {
// 設(shè)置要搜索的關(guān)鍵詞
String keyword = "TID:5bc8f75f1ad5450dab3127896bed429b.65.16849102400674853";
// 日志文件路徑
String logFilePath = "D:\\log\\home\\xiahui-wms-rfbiz-application\\xiahui-wms-rfbiz-2023-05-24.2.log";
File logFile = new File(logFilePath);
try (BufferedReader br = new BufferedReader(new FileReader(logFile))) {
String line;
int lineNum = 1;
while ((line = br.readLine()) != null) {
if (line.contains(keyword)) { // 如果這一行包含關(guān)鍵詞
System.out.printf("[%d]: %s%n", lineNum, line); // 輸出這一行
}
lineNum++;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}這段Java代碼實(shí)現(xiàn)了讀取指定路徑下的日志文件,并在日志文件中搜索指定的關(guān)鍵詞。
具體實(shí)現(xiàn)過程如下:
- 1.指定要搜索的關(guān)鍵詞和日志文件路徑;
- 2.創(chuàng)建File對象,表示要讀取的日志文件;
- 3.創(chuàng)建BufferedReader對象,指定字符流讀取日志文件內(nèi)容;
- 4.讀取每一行的內(nèi)容,如果該行包含關(guān)鍵詞,則將該行內(nèi)容輸出到控制臺(tái);
- 5.繼續(xù)讀取下一行,直到讀取到文件末尾;
- 6.關(guān)閉BufferedReader對象,釋放資源。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class LogSearcher {
public static void main(String[] args) throws ParseException {
String directoryPath = "D:\\log\\home\\xiahui-wms-rfbiz-application";
File directory = new File(directoryPath);
// 獲取目錄下所有的log文件路徑
List<String> logFilePaths = new ArrayList<>();
for (File file : directory.listFiles()) {
if (file.isFile() && file.getName().endsWith(".log")) {
logFilePaths.add(file.getAbsolutePath());
}
}
// 循環(huán)遍歷每個(gè)日志文件進(jìn)行查找
List<String> targetLogs = new ArrayList<>();
for (String logFilePath : logFilePaths) {
try (BufferedReader reader = new BufferedReader(new FileReader(logFilePath))) {
String line;
while ((line = reader.readLine()) != null) {
if (line.contains("5bc8f75f1ad5450dab3127896bed429b.65.16849103054344859")) {
targetLogs.add(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 對結(jié)果按時(shí)間排序
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Collections.sort(targetLogs, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
try {
Date d1 = dateFormat.parse(o1.substring(0, 19)); // 將字符串截取到時(shí)間部分,按格式解析成Date類型
Date d2 = dateFormat.parse(o2.substring(0, 19));
return d1.compareTo(d2); // 用Date類型比較時(shí)間
} catch (ParseException e) {
e.printStackTrace();
return 0;
}
}
});
// 顯示查找的結(jié)果
System.out.println("Found " + targetLogs.size() + " logs:");
for (String log : targetLogs) {
System.out.println(log);
}
}
}
這段Java代碼實(shí)現(xiàn)了在指定目錄下查找所有以“.log”結(jié)尾的日志文件,并從這些日志文件中查找包含指定關(guān)鍵詞的日志,根據(jù)時(shí)間進(jìn)行排序輸出結(jié)果。
具體實(shí)現(xiàn)過程如下:
- 1. 指定目錄路徑;
- 2. 創(chuàng)建File對象,表示要查找的目錄;
- 3. 獲取目錄下所有以“.log”為后綴的文件路徑;
- 4. 遍歷每個(gè)日志文件,打開文件,按行讀取內(nèi)容,查找包含指定關(guān)鍵詞的日志,并將其保存到targetLogs集合中;
- 5. 關(guān)閉文件讀取流,釋放資源。
- 6. 對找到的日志集合按時(shí)間進(jìn)行排序,時(shí)間格式采用“yyyy-MM-dd HH:mm:ss”;
- 7. 輸出找到日志的總數(shù)以及展示日志詳情。
另外在使用該工具類的時(shí)候遇到一個(gè)問題,當(dāng)根據(jù)某個(gè)關(guān)鍵字進(jìn)行查詢所對應(yīng)的日志,當(dāng)日志數(shù)據(jù)量大的時(shí)候,查詢到的日志在控制臺(tái)輸出不完整的問題
解決方案
通過Console配置修改來修改,點(diǎn)擊 File ->Settings ->editor - >General->Console 選中如下圖:

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring?@Scheduled定時(shí)器注解使用方式
這篇文章主要介紹了Spring?@Scheduled定時(shí)器注解使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
springboot中使用FastJson解決long類型在js中失去精度的問題
這篇文章主要介紹了springboot中使用FastJson解決long類型在js中失去精度的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
tk.mybatis如何擴(kuò)展自己的通用mapper
這篇文章主要介紹了tk.mybatis如何擴(kuò)展自己的通用mapper操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
java對象list使用stream根據(jù)某一個(gè)屬性轉(zhuǎn)換成map的3種方式舉例
開發(fā)小伙伴們通常會(huì)需要使用到對象和Map互相轉(zhuǎn)換的開發(fā)場景,下面這篇文章主要給大家介紹了關(guān)于java對象list使用stream根據(jù)某一個(gè)屬性轉(zhuǎn)換成map的3種方式,需要的朋友可以參考下2024-01-01
SpringBoot調(diào)整ApplicationContextAware如何實(shí)現(xiàn)類加載順序
SpringBoot調(diào)整ApplicationContextAware實(shí)現(xiàn)類加載順序問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
springboot攔截器不攔截靜態(tài)資源,只攔截controller的實(shí)現(xiàn)方法
這篇文章主要介紹了springboot攔截器不攔截靜態(tài)資源,只攔截controller的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
詳解Java中多線程異常捕獲Runnable的實(shí)現(xiàn)
這篇文章主要介紹了詳解Java中多線程異常捕獲Runnable的實(shí)現(xiàn)的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這樣的知識(shí),需要的朋友可以參考下2017-10-10

