2009-05-12 9 views
0

Also, ich möchte das vergangene Jahr von Tomcat Combined Format Dateien in eine Datenbank einfügen. Es gibt Zillionen und Zillionen von Treffern.Tool, um HTTP-Protokolldatei in Datenbank (mit definiertem Schema) zu setzen?

(Der Plan ist, maßgeschneiderte zu laufen und Ad-hoc- Abfragen dagegen, und mit einigen anderen Daten zusammenpassen. Wir haben einige Fragen, die Log-Analyse-Produkte gibt, bestehende können uns nicht beantworten.)

Was ich suche ist ...

  1. ein robustes Werkzeug sauber zu meiner Datei in die Datenbank
  2. eine vorhandene importieren (getippt, durchdacht, fehlerfrei) Schema zu speichern und Struktur

Ich bin einen halben Schritt davon entfernt, mein eigenes zu rollen, aber das scheint etwas zu sein, was ich vorher schon getan habe - zig Millionen Male.

Antwort

1

ich würde nur das Drehbuch schreiben ..

Es könnte bereits unzählige Male zuvor geschrieben hat, aber ich bezweifle, wird es für die richtige Datenbank wurde oder für Ihre spezifische Protokollkonfiguration (nicht sicher über die erweiterten W3C Log-Format, aber mit vielen anderen können Sie eine benutzerdefinierte Formatierung)

mit Blick auf log format doc definieren, sollte es ziemlich trivial sein jedes Feld Anzeige nehmen eine Spalte in der DB für sie schaffen ..

Dann zu parsen Sie das Beispielprotokoll aus dem Protokollformat doc:

#Version: 1.0 
#Date: 12-Jan-1996 00:00:00 
#Fields: time cs-method cs-uri 
00:34:23 GET /foo/bar.html 
12:21:16 GET /foo/bar.html 
12:45:52 GET /foo/bar.html 
12:57:34 GET /foo/bar.html 

..die folgende Skript wird funktionieren, die nur wenige Minuten dauerte schreiben:

import re 
import sys 

mr = re.compile("^(\d\d:\d\d:\d\d) ([A-Z]+) (.+)$") 

def insert_into_database(time, rtype, uri): 
    print "INSERT INTO database (%s, %s, %s)" % (time, rtype, uri) 

for line in open("logfile.log").readlines(): 
    m = mr.match(line) 
    if not m: 
     sys.stderr.write("Invalid line: %s\n" % line.strip()) 
    else: 
     insert_into_database(m.group(1), m.group(2), m.group(3)) 

die robusteste/zuverlässige Skript auch immer sein mag nicht, aber es funktioniert (na ja, abgesehen von ! die insert_into_database Funktion)

+1

http://www.w3.org/TR/WD-logfile ist das erste Google-Ergebnis für "W3C erweitert". und dbr's Code behandelt das Beispiel auf dieser Seite –

+1

ich stehe korrigiert. habe eine Frage bearbeitet, um zu bekommen, was ich will. Aber es gibt noch keine typisierte Datenbank Schema ... –

1

Dies sollte Sie weg in die richtige Richtung starten:

Writing Apache Logs zu MySQL http://onlamp.com/pub/a/apache/2005/02/10/database_logs.html

Ziemlich einfach an eine andere Datenbank anzupassen oder das Schema anzupassen. Es gibt nicht viel für das Schema wirklich - nur eine einfache Tabelle wird mit den entsprechenden Feldern und Indizes für die effiziente Suche tun.

+0

Apache Tomcat ist nicht Apache httpd. Großer Unterschied. Und selbst wenn es ein einzelnes Tabellenschema ist, sind die genauen Datentypen und -größen wichtig, wenn über Hunderte von Millionen Zeilen gesprochen wird. –

+0

@Stu: Das "kombinierte" Format von Tomcat ist dasselbe wie das "kombinierte" httpd-Format. – Stobor

+0

Punkt ist, diese Seite ist sehr über die Verwendung von mod_log_sql, die nicht in Tomcat funktioniert. Es sei denn, du schlägst nur vor, dass ich das Schema beachte, aber aus deiner Antwort scheint es nicht so zu sein. –

0

Werfen Sie einen Blick auf asql. Es ist ein Perl-Skript, das Ihre Apache-Dateien in eine SQLite-Datenbank importiert.

+0

Während dies theoretisch die Frage beantworten könnte, [wäre es vorzuziehen] (// meta.stackoverflow.com/q/8259), die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. –

+0

@BhargavRao Ich denke, dass Sie hier ein wenig überschwemmen. Ich gebe nicht nur einen Link, ich gebe auch Kontextinformationen für diesen Link. Der OP bat nicht um eine Lösung, er bat um ein Werkzeug. Was wären die "wesentlichen Teile der Antwort hier"? – tobltobs