我创建了一个流程来帮助我解析日志文件。日志文件需要使用字符串标签进行标记。从来没有记录可以提供这个字符串标签,所以我需要在每个日志事件中维护一些状态,以便每个事件都有一个标签。如果事件缺少标签,我想使用找到的最后一个标签。这使我能够解析如下所示的日志并具有与消息行关联的“标签”,即使它们是 eventindex04 记录标头的一部分。我可以将事件包装在一个信封中并在信封中包含逻辑,但是我到处都有一个看起来很重的信封。
eventindex01 start log ...
eventindex02 time ...
eventindex03 user ...
eventindex04 message
message1
message2
eventindex05 start log ...
我把这个工作正常的过程放在一起:
def extractStatefulAttribute[T, D](first: T)(getTag: D => Option[T]):
Process1[D, (T, D)] = {
def go(lastTag: T): Process1[D, (T, D)] = {
Process.receive1[D, (T, D)] {
event: D =>
val tag = getTag(event) getOrElse lastTag
Process.emit((tag, event)) ++ go(tag)
}
}
go(first)
}
这感觉应该表示为扫描/折叠,但我无法使其工作。这可以重写为扫描/折叠吗?