Schnelle Text Suche über Protokolle

8

Hier ist das Problem, das ich habe, ich habe eine Reihe von Protokollen, die ziemlich schnell wachsen können. Sie werden jeden Tag in einzelne Dateien aufgeteilt, und die Dateien können leicht zu einem Gig wachsen. Um die Größe gering zu halten, werden Einträge, die älter als 30 Tage sind, gelöscht.

Das Problem ist, wenn ich diese Dateien nach einer bestimmten Zeichenfolge durchsuchen möchte. Gerade jetzt ist eine Suche nach Boyer-Moore unausweichlich langsam. Ich weiß, dass Anwendungen wie dtSearch eine wirklich schnelle Suche mit Indizierung bieten können, aber ich bin mir nicht sicher, wie ich das implementieren kann, ohne doppelt so viel Platz in Anspruch zu nehmen wie ein Protokoll.

Gibt es irgendwelche Ressourcen, die ich auschecken kann, die helfen können? Ich suche wirklich nach einem Standardalgorithmus, der erklärt, was ich tun soll, um einen Index zu erstellen und ihn für die Suche zu verwenden.

Bearbeiten:
Grep funktioniert nicht, da diese Suche in eine plattformübergreifende Anwendung integriert werden muss. Es gibt keine Möglichkeit, dass ich in der Lage sein werde, einschließlich eines externen Programms darin zu schwingen.

Wie es funktioniert, gibt es ein Web-Frontend mit einem Log-Browser. Dies spricht mit einem benutzerdefinierten C ++ - Webserver-Back-End. Dieser Server muss die Protokolle in einer angemessenen Zeitspanne durchsuchen. Die Suche durch mehrere Gigs von Logs dauert ewig.

Bearbeiten 2: Einige dieser Vorschläge sind großartig, aber ich muss wiederholen, dass ich keine andere Anwendung integrieren kann, es ist Teil des Vertrags. Um jedoch einige Fragen zu beantworten, variieren die Daten in den Protokollen entweder von empfangenen Nachrichten in einem gesundheitsspezifischen Format oder von Nachrichten, die sich auf diese beziehen. Ich bin auf der Suche nach einem Index, da es zwar bis zu einer Minute dauern kann, bis der Index neu erstellt wurde, die Suche dauert jedoch sehr lange (ich habe gesehen, dass sie bis zu 2,5 Minuten dauert). Außerdem werden viele Daten verworfen, bevor sie aufgezeichnet werden. Wenn einige Debugprotokollierungsoptionen nicht aktiviert sind, werden mehr als die Hälfte der Protokollmeldungen ignoriert.

Die Suche läuft im Grunde wie folgt ab: Ein Benutzer im Web-Formular wird mit einer Liste der neuesten Nachrichten angezeigt (gestreamt von der Festplatte, während sie scrollen, yay für ajax), normalerweise werden sie nach Nachrichten mit suchen wollen einige Informationen darin, vielleicht eine Patienten-ID oder eine Zeichenfolge, die sie gesendet haben, und so können sie die Zeichenfolge in die Suche eingeben. Die Suche wird asynchron gesendet, und der benutzerdefinierte Webserver durchsucht die Protokolle 1 MB für einige Ergebnisse linear. Dieser Prozess kann sehr lange dauern, wenn die Protokolle groß werden. Und das versuche ich zu optimieren.

    
ReaperUnreal 02.10.2008, 18:16
quelle

6 Antworten

2

Sieh dir die Algorithmen an, die Lucene benutzt, um sein Ding zu machen. Sie werden jedoch wahrscheinlich nicht sehr einfach sein. Ich musste einige dieser Algorithmen einmal studieren, und einige von ihnen sind sehr anspruchsvoll.

Wenn Sie die "Wörter" in dem Text identifizieren können, den Sie indizieren möchten, erstellen Sie einfach eine große Hashtabelle der Wörter, die einen Hash des Worts auf seine Vorkommen in jeder Datei abbildet. Wenn Benutzer dieselbe Suche häufig wiederholen, speichern Sie die Suchergebnisse zwischen. Wenn eine Suche abgeschlossen ist, können Sie jeden Standort überprüfen, um zu bestätigen, dass der Suchbegriff dort fällt, und nicht nur ein Wort mit einem passenden Hash.

Auch, wen kümmert es wirklich, wenn der Index größer ist als die Dateien selbst? Wenn dein System wirklich so groß ist, mit so viel Aktivität, sind ein paar Dutzend Gigs für einen Index das Ende der Welt?

    
PeterAllenWebb 02.10.2008, 19:19
quelle
5

grep funktioniert normalerweise ziemlich gut mit großen Logs (manchmal 12G +). Sie können auch eine Version für Windows hier finden.

    
changelog 02.10.2008 18:21
quelle
2

Wahrscheinlich möchten Sie eine Art Indexsuchmaschine in Ihre Anwendung integrieren. Es gibt Dutzende da draußen, Lucene scheint sehr beliebt zu sein. Überprüfen Sie diese zwei Fragen für einige weitere Vorschläge:

Beste Textsuchmaschine für die Integration in benutzerdefiniertes Web App?

Wie implementiere ich Suchfunktionen in einer Website?

    
davr 02.10.2008 18:34
quelle
0

Weitere Details zu der Art der Suche, die Sie durchführen, könnten definitiv helfen. Warum möchten Sie sich insbesondere auf einen Index verlassen, da Sie ihn jeden Tag neu erstellen müssen, wenn sich die Protokolle überrollen? Welche Art von Informationen enthält diese Protokolle? Kann etwas davon verworfen werden, bevor es überhaupt aufgezeichnet wird?

Wie lange dauern diese Suchen jetzt?

    
PeterAllenWebb 02.10.2008 18:29
quelle
0

Vielleicht möchten Sie die Quelle für BSD grep auschecken. Sie können sich vielleicht nicht darauf verlassen, dass grep für Sie da ist, aber nichts sagt Ihnen, dass Sie ähnliche Funktionen nicht erstellen können, oder?

    
Hank Gay 02.10.2008 20:08
quelle
-2

Splunk eignet sich hervorragend zum Durchsuchen vieler Protokolle. Kann für deinen Zweck übertrieben sein. Sie zahlen entsprechend der Menge an Daten (Größe der Protokolle), die Sie verarbeiten möchten. Ich bin mir ziemlich sicher, dass sie eine API haben, so dass Sie ihr Frontend nicht verwenden müssen, wenn Sie nicht möchten.

    
nathan 02.10.2008 18:34
quelle