一番調研以后,在僅使用java的基礎上系統日志文件似乎不太可能(就個人調研結果來看),再通過多渠道查詢(百度、chargpt),找到2個可能的實現的方案:
1、使用Java來調用C++方法JNA(Java Native Access)是可以讓Java調用C++生成的DLL(動態鏈接庫),將C++中的方法,以Java接口的方式來實現。注:該方法理論是是可行的,但編者沒有實踐。。。
(資料圖片)
在本地安裝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:事件IDEventType:事件類型Strings:字符串數組,應該對應者日志中的EventData,每個事件包含的信息應該不一樣這里只羅列了一部分字段,還有其它字段大家按需了解使用即可。
寫在最后:此貼為編者自己記錄所用,僅供參考寫的比較亂,如有筆誤,請指正未完待續關鍵詞: