我有一些日志文件,它们看起来像是文件流文本,其中包含c ++命名空间工件(由双冒号::提示)和XML嵌入的某些内容。我已经加载了日志并将其显示在浏览器应用程序中,该应用程序将内容与Unix时间戳分开,如下所示:
1564002293071 INFO: ToGroundMessageFilter::addSubscriptionAddress staged subscribe address [uxas.messages.uxnative.KillSer
1564002293073 INFO: *** INITIALIZING:: Service[ToGroundMessageFilter] Service Id[64] with working directory [] ***
1564002293082 INFO: WorldviewTransformationService::configure Location offsets = (lat:0, lon:0, alt:0)
1564002311397 INFO: WatchdogManagerService::<WaypointActual Series="TACE"><Waypoint><Waypoint Series="TACE"><RemediationId>1</RemediationId><StatePlatformId>58</StatePlatformId><LatLonAlt><LatLonAlt Series="TACE"><Altitude>366</Altitude><Latitude>34.97866</Latitude><Longitude>-117.85169</Longitude></LatLonAlt></LatLonAlt><Speed>0</Speed><Heading>0</Heading><Roll>0</Roll><Pitch>0</Pitch><Yaw>0</Yaw></Waypoint></Waypoint><SenderID>68</SenderID><ActualTime>0</ActualTime><PerceivedTime>0</PerceivedTime><SenderPlatformWorld>Constructive</SenderPlatformWorld><SenderPlatformType>Other</SenderPlatformType><Comment></Comment></WaypointActual>
1564002312386 INFO: ProximityConstraintService::<WatchdogConstraintViolation Series="TACE"><ConstraintId>-2</ConstraintId><Latching>true</Latching><Priority>1</Priority><RequestedRemediationId>1</RequestedRemediationId><HasViolation>false</HasViolation><ConstraintName>Proximity</ConstraintName><SenderID>72</SenderID><ActualTime>1564002312385</ActualTime><PerceivedTime>1564002312385</PerceivedTime><SenderPlatformWorld>Live</SenderPlatformWorld><SenderPlatformType>Air</SenderPlatformType><Comment></Comment></WatchdogConstraintViolation>
现在的预期方向是获取此日志并将其解析出来,然后使用javascript将其保存为csv。不幸的是,我不确定如何解决这个问题。 JS具有XML对象解析器。但是,如果每行的内容不是XML,该怎么办?我希望有一列用于Unix时间戳,名称空间名称和其他详细信息(请参阅底部的示例表)。
此外,我具有每个事件名称空间的格式。这里是2的示例。随着软件的更新,这些类似XML的配置会随着时间而更新。我大约定义了24种以上的XML结构化“服务”,如下所示。有没有一种方法可以使解析器根据服务名称“加载XML配置”?
WorldViewTransformationService
<AutonomyWaypointActual Series="TACE">
<Waypoint>
<Waypoint Series="TACE">
<RemediationId></RemediationId>
<StatePlatformId></StatePlatformId>
<LatLonAlt>
<LatLonAlt Series="TACE">
<Altitude></Altitude>
<Latitude></Latitude>
<Longitude></Longitude>
</LatLonAlt>
</LatLonAlt>
<Speed></Speed>
<Heading></Heading>
<Roll></Roll>
<Pitch></Pitch>
<Yaw></Yaw>
</Waypoint>
</Waypoint>
<SenderID></SenderID>
<ActualTime></ActualTime>
<PerceivedTime></PerceivedTime>
<SenderPlatformWorld></SenderPlatformWorld>
<SenderPlatformType></SenderPlatformType>
<Comment></Comment>
</AutonomyWaypointActual>
ProximityConstraintService
<ProximityConstraint Series="TACE">
<Radius></Radius>
<OtherPlatformId></OtherPlatformId>
<ConstraintId></ConstraintId>
<PlatformId></PlatformId>
<Latching></Latching>
<Priority></Priority>
<RequestedRemediationId></RequestedRemediationId>
<ConstraintName></ConstraintName>
</ProximityConstraint>
输出为CSV的示例:(请注意,诸如ProximityConstraintService之类的事件不包含任何海拔,俯仰或偏航信息。
unix | event | altitude | pitch | yaw | Priority | Latching
1564002293071 ToGroundMessageFilter - - - - -
1564002293073 INITIALIZING - - - - -
1564002293082 WorldviewTransformationService 100 15 4 - -
1564002300983 WorldviewTransformationService 220 16 2 - -
1564002312386 ProximityConstraintService - - - 3 1
答案 0 :(得分:0)
有多种方法可以实现。
如果您想正确地解析XML(这是正确的方法),我可能会通过两步以惰性方式完成,首先将日志文件转换为正确的XML,然后使用标准的XML解析/查询从适当的XML生成CSV的工具。
细节决定成败,所以,如果这对您不起作用,请告诉我们,但我可能会这样做:
1)grep日志仅保留我感兴趣的行;
2)将我感兴趣的所有日志消息包装到一些root标记下的一些通用logentry XML中,如下所示:
<logfile>
...
<logentry timestamp="1564002311397" level="INFO" source="WatchdogManagerService">
<WaypointActual Series="TACE"><Waypoint>...</WaypointActual>
</logentry>
<logentry ...>...</logentry>
...
</logfile>
3)使用普通的XSLT或其他处理器将生成的XML解析为CSV作为正确的XML文件。
您唯一不能做的就是自动处理这24种以上的XML格式,以便在CSV中获得正确的输出。对于每种不同的XML格式,您可能必须编写一个不同的XSLT模板,该模板适用于这种类型的logentry内容。但是随后它们都可以合并到一个XSLT文件中,因此您可以一次将单个XSLT应用于整个日志文件。