我正在使用一个小node.js应用程序来解析运行日志文件,以便根据结果提取键值并生成自定义警报。但是,我现在遇到了一个我似乎找不到解决方案的问题。
为了清楚起见,以下是可能的日记条目的三个示例(由于隐私原因而更改了一些细节,结构保持完整):
$/path/to/a/project/folder
Version: 84
User: User1 Date: 14/01/27 Time: 12:15p
testBanner.rb added
Comment: Style and content changes based on corporate branding
Remove detector column on sc600 page
Styling tweaks and bug fixes
$/path/to/a/project/file.java
Version: 22
User: User2 Date: 14/01/29 Time: 12:34p
Checked in
Comment: Added fw updates to help fix (xxx) as seen in (yyy):
Changes include:
1) Peak tuning (minimum peak distance, and percentage crosstalk peak)
2) Dynamic pulses adjusted in run time by the sensor for low temperature climate
s
3) Startup noise automatic resets
4) More faults
$/path/to/a/project/folder
Version: 29
User: User3 Date: 14/01/30 Time: 11:54a
Labeled v2.036
Comment: Added many changes at this point, see aaVersion.java for a more comple
te listing.
到目前为止,已知以下几点:
- 第一条入口行是始终相关的VSS数据库项目或文件路径。
- 第二个入口行是始终上述项目或文件的相关版本。
- 第三条入口行始终包含三个值:
User:
,Date:
和Time:
。 - 第四条入门行是始终关联的操作,这可以是以下任何一个:
- 签入:{file}
- {file}添加
- {文件夹}创建
- {文件或文件夹}删除
- {文件或文件夹}被销毁
- 标签:{label}
- 第五条入门行是可选的注释块,从
Comment:
开始。它可能包含任何类型的字符串输入类型,包括新行,文件名,括号等。基本上,VSS完全不限制注释内容。
我找到了匹配所有内容的正则模式 "评论:"部分,不知道评论中可能包含多少个新的line字符,这对于像我这样的人来说真的很困难't完全流利地说话。
到目前为止,我设法让我的应用程序观看日记文件进行更改,并仅在流中获取新的数据。我的最初计划是在流输出上使用.split('nn')
来捕获每个单独的条目,但是由于注释也可能包含任何位置的任何新行,因此这不是一种安全的方法。
我找到了一个名为Regex-stream的模块,这使我认为在提取细节之前,我不需要在一系列字符串中收集结果,但我并不真正了解给定的用法示例。另外,只要我找到一种可靠的方法将流到单个条目中分解的方法时,我就没有问题。
。最后,我正在寻找一系列对象,其中每个更新的每个更新都有以下输入结构:
{
path: "",
version: "",
user: "",
date: "",
time: "",
action: "",
comment: ""
}
请注意:如果在一个操作中检查了100个文件,则VSS仍将为每个文件记录一个条目。为了防止通知垃圾邮件,我仍然需要在生成任何通知之前执行其他验证和分组。
我的应用程序的当前状态可以在此github存储库中看到。有人可以在这里帮助我指向正确的方向...?
当评论部分可以包含任何东西时,没有100%的万无一失的方法。下一个最佳选择是做一些启发式方法,并希望没有疯狂的评论。
如果我们可以假设2条新线后路路径表示条目的开始,那么我们可以在此正则分开(在您将行分隔符的所有变体替换为n
之后):
/nn(?=$/[^n]*n)/
look-aead (?=pattern)
检查是否有前方的路径$/[^n]*n
,而不会消耗它。
要肯定,您可以将其检查是否在路径之后遵循的版本行:
/nn(?=$/[^n]*nVersion: d+n)/