2011-01-06 1 views
8

Gibt es eine C++ - Bibliothek speziell für das Log-Parsing (um mehrzeilige Ereignisse zu erkennen)? Wie MergeLog für Apache-Logs oder libcurl für Web-Parsing?C++ - Bibliothek für das Log-Parsing

+0

Ja, es heißt boost :: regex. –

+0

Vielleicht wird Maxims Vorschlag für diesen Fall wirklich ausreichen. Boost.Xpressive sieht schöner aus, http://www.boost.org/doc/libs/1_36_0/doc/html/xpressive.html –

Antwort

6

Sofern Sie nicht auf eine geeignete Bibliothek stoßen, wäre mein Ratschlag, einen Standalone-Lexer zu verwenden.

  • Anstelle von flex + bison verwenden Sie flex alone (C/C++).
  • Anstelle von ocamllex + ocamlyacc ocamllex alone (OCaml) verwenden.
  • Ragel (C/C++/Ziel C/D/Java/Ruby).
  • Auf diese Weise vermeiden Sie, eine Grammatik zu definieren (was für Protokolldateien ohnehin sinnlos ist) und vermeiden das gefürchtete Frankenstein-Regex-Monster, das manchmal an dunklen Orten zu sehen ist.

    2

    Mir sind keine Log-Parsing-Bibliotheken bekannt. Sie könnten immer einen Allzweck-Parser-Generator verwenden, wie Boost.Spirit, ANTLR oder lex/yacc; Dieser Ansatz wäre wahrscheinlich mehr Arbeit, aber er ist extrem flexibel.

    Wenn ein Parser-Generator übertrieben ist, dann würde ich einfach eine Menge Regexes auf die Logdateien werfen.

    +0

    Danke Josh, yacc/lex sieht ein wenig schwer auf dem Programmierer. –

    +0

    Sie können den Parser-Teil überspringen und einen Standalone-Lexer verwenden. Dies ist viel praktischer als ein Haufen unstrukturierter Regexes und viel einfacher als ein vollständiger Parser. – bltxd

    +0

    @stack_zen: Spirit, ANTLR und lex/yacc erfüllen alle dieselbe Rolle, mehr oder weniger. Spirit und ANTLR sind moderner und wahrscheinlich leichter zu erlernen. Sie alle können ein bisschen schwer sein, wie Sie sagten, aber sie sind mächtige Werkzeuge. –