2008-10-02 4 views
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.Schnelle Text Suche über Logs

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 sehr schnelle Suche mit Indizierung bieten können, aber ich bin mir nicht sicher, wie ich das implementieren kann, ohne doppelt so viel Speicherplatz in Anspruch zu nehmen wie ein Protokoll.

Gibt es irgendwelche Ressourcen, die ich auschecken kann, die helfen können? Ich bin wirklich auf der Suche 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 wird nicht funktionieren, da diese Suche in eine plattformübergreifende Anwendung integriert werden muss. Es gibt keine Möglichkeit, dass ich in der Lage bin, mit einem externen Programm zu spielen.

Die Art, wie es funktioniert, ist, dass es ein Webfrontend gibt, das einen Protokollbrowser hat. Dies spricht mit einem benutzerdefinierten C++ - Webserver-Back-End. Dieser Server muss die Protokolle in einer angemessenen Zeitspanne durchsuchen. Derzeit dauert das Durchsuchen mehrerer Protokolle mehrere Zeit.

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 Wesentlichen wie folgt ab: Ein Benutzer im Web-Formular wird mit einer Liste der neuesten Nachrichten präsentiert (gestreamt von der Festplatte, während sie blättern, yay für Ajax), in der Regel wollen sie nach Nachrichten suchen mit einigen Informationen darin, vielleicht einer Patienten-ID oder einer 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.

+0

Probieren Sie es mit Grep als ein externes Tool aus, wenn es schnell genug ist, können Sie den Gnu Grep Quellcode nehmen und direkt in Ihre App integrieren. – gbjbaanb

+0

Ich würde gerne, aber es ist ein rechtliches Problem, wenn ich es einschließe, habe ich gefragt, diesen Weg zu gehen. – ReaperUnreal

Antwort

2

Überprüfen Sie die Algorithmen, die Lucene verwendet, um seine Sache zu tun. 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" im zu indizierenden Text identifizieren können, erstellen Sie einfach eine große Hashtabelle der Wörter, die den Vorkommen in jeder Datei einen Hash des Worts zuordnet. Wenn Benutzer dieselbe Suche häufig wiederholen, speichern Sie die Suchergebnisse zwischen. Wenn eine Suche abgeschlossen ist, können Sie dann 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 als die Dateien selbst ist? 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?

5

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

+0

Rechts. Das ist auch mein erster Gedanke, aber das OP muss wirklich ein wenig mehr Kontext bereitstellen, um zu bewerten, wie nützlich dieser Vorschlag sein könnte. – dmckee

0

Mehr Details über die 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 aufgenommen wird?

Wie lange dauern diese Suchen jetzt?

-2

Splunk für die Suche durch viele Protokolle groß ist.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.

0

Sie können die Quelle für BSD grep überprüfen. 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, richtig?