Graylog ist ein System zum zentralen Sammeln und Auswerten von Log-Meldungen. Das System selbst ist open source und basiert auf Java. Mit der neuen Version wurde die Funktion „Processing Pipelines“ eingeführt, welche es erlaubt eingehende Log-Meldungen durch Scripte weiter anzureichern.
In meinem Fall lasse ich den Proxyserver Squid seine Zugriffe auf den Graylog-Server protokollieren, dort kommt hierdurch jedoch ausschließlich die nicht weiter aufgeschlüsselte Zeile im Squid Log Format an. Über eine Pipeline mit Regex wird diese weiter zerlegt und in einzelne Felder aufgeteilt, sodass ein granulareres Suchen möglich ist.
Das Ganze ist nur als Testaufbau zu sehen, es fehlt eine Fehlerbehandlung etc. Da ich aber etwas an der Syntax hing hilft es eventuell ja anderen Suchenden. Wichtig ist es die Backslashes selbst zu escapen um als gültiger Java-Code angenommen zu werden. Die Benennung der Treffer durch das letzte Array im Regex-Aufruf ist optional – ohne werden die Treffer mit 0 beginnend durchnummeriert.
rule "test squid" when contains(to_string($message.message), "HIER_DIRECT") then let sqmat = regex(".*([\\d\\.]+)\\s+(\\d+) ([\\d\\.\\:A-Fa-f]+) (\\w+)/(\\d+) (\\d+) (\\w+) ([^ ]+) \\- HIER_DIRECT/([\\d\\.\\:A-Fa-f]+) ([^\\s]+).*", to_string($message.message), ["timestamp", "duration", "user", "result", "status", "bytes", "method", "url", "mime"]); set_field("squid_request", true); set_field("squid_duration", sqmat.groups.duration); set_field("squid_user", sqmat.groups.user); set_field("squid_result", sqmat.groups.result); set_field("squid_status", sqmat.groups.status); set_field("squid_bytes", sqmat.groups.bytes); set_field("squid_method", sqmat.groups.method); set_field("squid_url", sqmat.groups.url); set_field("squid_mime", sqmat.groups.mime); end