Freitag, März 28, 2014

Log-Dateien parsen mit Postgres

Gerade ist mir klar geworden, wie handlich das Parsen von Log-Dateien in der postgres-Datenbank ist. Der gesamte Vorgang beschränkt sich auf folgende Schritte:

-- Anlage einer Tabelle mit einer einzigen Spalte (vom Typ TEXT)
create table my_log(log_line text);

-- Einlesen via copy-Kommando
copy my_log(log_line)
from 'pfad_der_log_dateien/log_datei.txt';

-- Parsen der Eingabe-Strings mit Hilfe der Funktion split_part in beliebig viele Abschnitte
-- „Split string on delimiter and return the given field (counting from one)“
select split_part(log_line, ' ', 1) ip
     , split_part(log_line, ' ', 2) p2
     , split_part(log_line, ' ', 3) p3
     , split_part(log_line, ' ', 4) p4
     , split_part(log_line, ' ', 5) p5
     , split_part(log_line, ' ', 6) p6
     , split_part(log_line, ' ', 7) p7
     , split_part(log_line, ' ', 8) p8
     , split_part(log_line, ' ', 9) p9
     , split_part(log_line, ' ', 10) p10
     , split_part(log_line, ' ', 11) p11
  from my_log

Neben der extrem simplen Syntax für die copy-Operation ist die Funktion split_part entscheidend: ursprünglich hatte ich eine INSTR-Funktion gesucht (aber nur POSITION gefunden), aber SPLIT_PART entspricht meinen Erfordernissen deutlich besser. Voraussetzung ist natürlich eine klar definierte Struktur der einzulesenden Datei mit eindeutigen Delimitern, aber wenn die Voraussetzungen stimmen, ist das Verfahren äußerst effizient.

Keine Kommentare:

Kommentar veröffentlichen