#### 近日公司有個需求,需要調研如何使用Java來讀取Windows日誌文件(類型:應用程式,安全,Setup,系統) ![](https://img2023.cnblogs.com/blog/1519440/202307/1519440-20230704100117681-1957523520 ...
近日公司有個需求,需要調研如何使用Java來讀取Windows日誌文件(類型:應用程式,安全,Setup,系統)
一番調研以後,在僅使用java的基礎上系統日誌文件似乎不太可能(就個人調研結果來看),再通過多渠道查詢(百度、chargpt),找到2個可能的實現的方案:
1、使用Java來調用C++方法
JNA(Java Native Access)是可以讓Java調用C++生成的DLL(動態鏈接庫),將C++中的方法,以Java介面的方式來實現。
註:該方法理論是是可行的,但編者沒有實踐。。。
2、使用第三方工具來實現,微軟的日誌分析工具-LogParser
2.1 實現思路:
在本地安裝LogParser,Java代碼通過調用本機命令行的方式,調用LogParser,然後把分析後的結果,以csv的方式輸出到文件中(LogParser可選多種輸出方式),然後java再讀取csv文件內容即可拿到日誌信息。
2.2 Java調用命令行的代碼
try {
String logParserPath = "D:\\Program Files (x86)\\Log Parser 2.2\\LogParser.exe";
ProcessBuilder processBuilder = new ProcessBuilder(logParserPath, "-i:EVT", "-o:csv", "SELECT * INTO D:\\output.csv FROM D:\\Security.evtx");
Process process = processBuilder.start();
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
其中:D:\output.csv 為存儲輸出結果的文件地址,D:\Security.evtx為日誌文件
2.3、 關於LogParser的一些使用文檔信息
2.3.1:Log Parser的日誌可以通過SQL進行查詢
sql欄位:
EventLog(S) RecordNumber(I) TimeGenerated(T)
TimeWritten(T) EventID(I) EventType(I)
EventTypeName(S) EventCategory(I) EventCategoryName(S)
SourceName(S) Strings(S) ComputerName(S)
SID(S) Message(S) Data(s)
S:String 數組
調用格式:
EXTRACT_TOKEN(EventTypeName, 0, '|') )
EventTypeName:欄位名
0:順序,從0開始
|:分隔符
T:Time。時間類
I:intger。整數類
T和I二者都是直接調用:
SELECT
TO_DATE(TimeGenerated),
RecordNumber,
TO_UPPERCASE(EXTRACT_TOKEN(EventTypeName, 0, '|')), SourceName
FROM System
欄位解析:
RecordNumber:日誌記錄編號從0開始
TimeGenerated:事件生成時間
TimeWritten:事件記錄時間
EventID:事件ID
EventType:事件類型
Strings:字元串數組,應該對應者日誌中的EventData,每個事件包含的信息應該不一樣
這裡只羅列了一部分欄位,還有其它欄位大家按需瞭解使用即可。
寫在最後:
- 此貼為編者自己記錄所用,僅供參考
- 寫的比較亂,如有筆誤,請指正
- 未完待續