如何用JavaScript提取Windows日志中第二次出现的Account Name值
问题原因
Windows 4624登录成功事件中,Account Name字段会在Subject(登录发起主体)、New Logon(新创建的登录会话)两个段落各出现一次。你当前的遍历逻辑没有区分字段所属段落,全局匹配字段时会优先拿到Subject段的机器账号SERVER$,无法获取目标用户名。
如果靠“取第二次匹配结果”的硬编码方式容错性极差,一旦事件版本调整、段落顺序变化就会抓取失败。
修复方案
新增段落状态标记,遍历日志行时先判断当前所处段落,仅当进入New Logon段落之后再捕获Account Name字段值,即可稳定拿到真实登录用户名,修改后完整代码如下:
var lines = value.split("\n"); var accountName = ""; var loginType = ""; var sourceIp = ""; var isInNewLogonBlock = false; lines.forEach(function(line) { var trimmed = line.trim(); // 识别段落边界,更新状态标记 if (trimmed === "New Logon:") { isInNewLogonBlock = true; } else if (trimmed.endsWith(":") && trimmed.indexOf(" ") !== 0) { // 匹配到其他一级段落(无前置缩进、冒号结尾),退出New Logon标记状态 isInNewLogonBlock = false; } // 提取登录类型 if (trimmed.substring(0, 11) === "Logon Type:") { loginType = line.substring(12).trim(); } // 仅在New Logon段落内提取账号名 if (isInNewLogonBlock && trimmed.substring(0, 13) === "Account Name:") { accountName = line.substring(14).trim(); } // 提取源IP if (trimmed.substring(0, 23) === "Source Network Address:") { sourceIp = line.substring(24).trim(); } }); return loginType + " " + accountName + " " + sourceIp;
方案说明
- 该逻辑完全适配Windows安全事件日志的格式规范:所有一级段落标题均为行首无缩进、以冒号结尾的格式,字段行均带前置缩进,段落识别准确率高
- 不受前置段落同名字段数量影响,哪怕后续日志版本新增其他带
Account Name字段的段落,也不会出现误抓取问题 - 不建议使用“匹配计数取第二个值”的方案,该方案无任何容错能力,日志结构微小变动就会导致解析失败
内容的提问来源于stack exchange,提问作者Carter
相关产品推荐
相关产品推荐

