我需要构建一个程序,可以读取实时日志记录,识别行,并解析数据。
我面临的问题:
据我所知,没有简单的方法可以做到这一点。我想知道是否有一种特定的方式来做这样的事情,因为它似乎非常压倒性的?
我目前的解决方案是阅读日志并通过日志的每一行运行我的所有正则表达式来测试它是否匹配。
我有一个类型为I DataReader
的数组,每个数组都包含多种RegEx格式,用于读取记录器行的不同版本。
首先,它使用以下方法测试DataReader
是否可以读取它
bool canUse(String text);
如果返回false,则尝试另一个DataReader
,直到它返回true。
如果canUse返回true,则它将使用
构造数据结构CompiledLogData constructData(String text);
我不是要求有人对此进行编码;我只是问这是否是正确的方法,或者是否有更好的方法,或许这种类型的东西更优化的方式?我相信有人曾经处理过这种情况吗? :)
希望有人能提供帮助,谢谢。
答案 0 :(得分:1)
这不一定是一个解决方案,但我喜欢在这样的情况下做的是在整个事情上使用RegEx语句......这样你就可以基于将整个日志读入内存来以编程方式构建你的行。就性能而言,它与你的相同,只是反方向(你为每一行做@,每个regexp @,我做@for整个日志,做每个regexp @)。
我喜欢我的方式是我可以通过将匹配放在单独的var中并在日志中替换它来减少每个匹配日志的大小,然后转到下一个regexp。关于它的不同方式我猜...
答案 1 :(得分:1)
如果您受C#约束,这可能是一个很好的方法。至少我不知道更好。
如果您只需要将数据转换为不同的输出格式(例如转换为文件),您可以使用awk脚本(awk是为这样的任务制作的)。此skript可能会从stdin读取您的日志消息,并将转换后的数据写入stdout。因此,您可以将日志消息传递给awk脚本,并从stdout获取转换后的数据,以便进一步处理。
阅读日志并转换数据是单独的应用程序,您可以更灵活地使用这些工具。
特别是当正则表达式经常更改时,您可以使用脚本语言来加速工作,以避免在c#中需要额外的编译步骤。