next up previous contents index
Search Next: Auswertungen mit sqlsh.rb Up: Logfiles mit MySQL analysieren Previous: Erstellen der Datenbank   Contents   Index

Logfiles in die Datenbank übertragen

Wir speichern die Daten nicht mehr in eigenen Hashtabellen, sondern übertragen Hostname und URL in die request-Tabelle. Die gesamte Auswertelogik des ersten Skripts entfällt, da sie später mit SQL-Befehlen implementiert wird.

require "dbi"
re = /(.*)\s-\s-\s(?:.*)(?:GET|POST)\s(.*)\sH/
split = "\n"
sql = "INSERT INTO request(host, url) VALUES(?, ?)"

DBI.connect("DBI:Mysql:logs",
  "rubychan", "Rubin") { |conn|
  conn.prepare(sql) { |query|
    loop {
      data = STDIN.read(4095) or break
      data += (STDIN.gets || "")
      for line in data.split(split)
        if md = re.match(line)
          query.execute(md[1], md[2])
        end
      end
    }
  }
}

Mit connect wird eine Verbindung zum lokalen MySQL-Server aufgebaut, wenn sich der angegebene Benutzer für die logs-Datenbank authentifizieren kann. Für die erhaltene Verbindung bereiten wir dann die SQL-Anweisung für das Einfügen vor. An Stelle der ? im SQL-Text fügt die execute-Methode der Reihe nach die angegebenen Argumente ein.


\epsfig{height=36pt,file=images/chan.eps}Wenn es der Datenbankserver unterstützt, parst und speichert prepare die SQL-Anweisung bis auf die ?-Parameter, so dass die Abfrage schneller ausgeführt werden kann. \epsfig{height=10pt,file=images/ruby.eps}



(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20