快速文本搜索日志

8
这是我的问题,我有一组日志可以很快地增长。它们每天被拆分为单独的文件,文件大小可以轻松增长到1GB。为了保持大小,30天前的条目会被清除。
问题在于当我想要搜索这些文件中的某个字符串时。现在,Boyer-Moore搜索非常慢。我知道像dtSearch这样的应用程序可以使用索引提供非常快的搜索,但我不确定如何实现它,而不会占用日志已经占用的两倍空间。
有没有资源可以帮助我?我真的正在寻找一个标准算法,它将解释我应该如何构建索引并使用它进行搜索。
编辑:
Grep行不通,因为此搜索需要集成到跨平台应用程序中。我无法将任何外部程序包含在其中。
它的工作方式是有一个Web前端,它有一个日志浏览器。这与自定义的C++ Web服务器后端进行通信。此服务器需要在合理的时间内搜索日志。目前搜索数GB的日志需要很长时间。
编辑2: 其中一些建议非常好,但我必须重申,我不能集成另一个应用程序,这是合同的一部分。但是回答一些问题,日志中的数据因接收到特定格式的医疗保健相关消息或与之相关的消息而有所不同。我希望依靠索引,因为尽管重建索引可能需要一分钟,但搜索目前需要很长时间(我曾经看到它需要2.5分钟)。此外,在记录数据之前,很多数据都被丢弃了。除非打开某些调试日志选项,否则超过一半的日志消息将被忽略。
搜索基本上是这样的:Web表单上的用户会看到最近消息的列表(随着他们滚动而从磁盘流式传输,对于ajax来说很好),通常,他们会想要搜索其中包含某些信息的消息,例如患者ID或他们发送的某个字符串,因此他们可以在搜索中输入字符串。搜索被异步发送,自定义Web服务器线性搜索每个1MB的日志以获取一些结果。当日志变大时,这个过程可能需要很长时间。这就是我要优化的地方。

尝试使用grep作为外部工具,如果速度足够快,您可以获取GNU grep源代码并将其直接集成到您的应用程序中。 - gbjbaanb
我想这样做,但如果我包含它,那就是一个法律问题,我已经询问过是否可以走这条路。 - ReaperUnreal
6个回答

5

grep 对于大型日志文件(有时12G+)通常效果很好。你也可以在这里找到Windows版本的grep


没错,这也是我的第一想法,但原帖作者确实需要提供更多的上下文以便评估这个建议有多有用。 - dmckee --- ex-moderator kitten

2

2
检查一下Lucene用于执行其操作的算法。虽然它们不太可能很简单,但我曾经不得不学习其中一些算法,其中一些非常复杂。
如果您可以识别要索引的文本中的“单词”,只需构建一个大型单词哈希表,将单词的哈希映射到每个文件中出现的次数。如果用户频繁重复相同的搜索,请缓存搜索结果。当进行搜索时,您可以检查每个位置以确认搜索术语是否存在,而不仅仅是与匹配哈希的单词。
此外,真正关心索引是否比文件本身更大的人有多少?如果您的系统真的如此庞大,并且活动量很大,那么索引占据几十吉字节是否就是世界末日呢?

0

更多关于您正在执行的搜索类型的详细信息肯定会有所帮助。为什么您特别想要依赖于索引,因为当日志滚动时您每天都必须重建它?这些日志中包含哪些信息?在记录之前是否可能将其中一些信息丢弃?

现在这些搜索需要多长时间?


0
你可能想查看BSD的grep源代码。也许你不能依赖于已经存在的grep,但这并不意味着你不能重新创建类似的功能,对吧?

-1

Splunk非常适合搜索大量日志。但对于您的目的来说可能过于复杂了。您需要根据要处理的数据量(日志大小)付费。我相信他们有一个API,所以如果您不想使用他们的前端,也可以自己开发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接