一番调研以后,在仅使用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,每个事件包含的信息应该不一样这里只罗列了一部分字段,还有其它字段大家按需了解使用即可。
写在最后:此贴为编者自己记录所用,仅供参考写的比较乱,如有笔误,请指正未完待续关键词: