BufferedReader: Vom Logfile zur Datenbank

mramaze

Mitglied
Hi Leute,

ist mein erster Beitrag also bitte nicht böse sein, falls es schon was zu dem Thema gibt. Hab auch schon gesucht und was gefunden, aber nicht hundertprozentig passend.

Hab grad irgendwie ne Blockade bzw. einen Denkfehler und komm nicht weiter.

Folgendes Szenario:
Ich möchte (erstmal zur Vereinfachung) ein Logfile (später mehrere) auslesen. Es sollen alle Datenfelder des Common Logfile-Formats (also IP-Adresse, Datum etc....) in ein eigenes Datenfeld einer Tabelle einer Datenbank geschrieben werden. Das auslesen funktioniert wunderbar. Hier mal mein bisheriger Code:

Java:
 public void readLogfile(String name) throws IOException {
    	 
    	 		
    			 FileInputStream fstream = new FileInputStream(name);
    
    			 DataInputStream in = new DataInputStream(fstream);

    			 BufferedReader br = new BufferedReader(new InputStreamReader(in));

    			 String strLine;

    	 
    			 	//Read File Line By Line
    			 	while ((strLine = br.readLine()) != null)   {
    	
    			 		// System.out.println (strLine);
    			 		
    			 		List<String> logList = new ArrayList<String>();
    			 		logList.add(strLine);
 						
    			 		Iterator<String> it = logList.iterator();
    			 		
    			 			while (it.hasNext()) {
    			 				
    			 				System.out.println(it.next());
    			 			
    			 				StringTokenizer tokenizer = new StringTokenizer(strLine);
    	    
    			 					while (tokenizer.hasMoreTokens()) {

    			 						tokenList = new ArrayList<String>();
    			 						tokenList.add(tokenizer.nextToken());
    			 	

    			 						System.out.println(tokenList);

    			 					
    			 					}    	    	
    			 			}
    			 	}

    	  //Close the input stream
    	  in.close();
    	  }

Ich schreibe jede Zeile in eine ArrayList und gehe anschließend mit dem StringTokenizer drüber um die einzelnen Datenfelder des Logfiles zu bekommen. Nun möchte ich jedes Datenfeld in die einer Datenbank speichern, bekomme das aber irgendwie nicht hin. In der Konsole wird alles so ausgegeben wie ich es möchte. Jedoch weiß ich nicht, wie ich auf die einzelnen Tokens zugreifen kann, um sie abzuspeichern.

Ich kann irgendwie nicht auf die Indizes der ArrayList zugreifen, um beispielsweise die IP-Adresse zu extrahieren und abzuspeichern (IP-Adressen sind im Logfile immer an erster Stelle, also hatt ich mir das ungefähr so gedacht: String ip = tokenList.get(0); o.ä.). Ich denke mal das funktioniert wegen der "dynamischen" Befüllung der Liste in der while-Schleife nicht.

Ich hoffe ich habe mein Problem deutlich ausgedrückt und bedanke mich für konstruktive Vorschläge. Steh gerade voll auf dem Schlauch ;).
 

KrokoDiehl

Top Contributor
Morgen.
Zunächst einmal kannst du dir den Block
Java:
                        List<String> logList = new ArrayList<String>();
                        logList.add(strLine);
                        
                        Iterator<String> it = logList.iterator();
                        
                            while (it.hasNext()) {
schenken, weil du immer nur eine Zeile liest und diese in eine temporäre Liste (logList) mit genau einen Eintrag zu schreiben ist unnötig. Du kannst also direkt mit dem Tokenizer anfangen.

Beim Tokenizer kannst du mitzählen welcher Index es ist, und die Werte entsprechend setzen, in etwa so:
Java:
while ((line = reader.readLine()) != null) {
    String ip = "";
    String timestamp = "";
    String message = "";
    //bzw. wasauchimmer

    int i = 0;
    StringTokenizer tokenzier = new StringTokenizer(line);
    while (tokenizer.hasMoreTokens()) {
        String token = tokenizer.nextToken();

        switch (i) {
            case 0: ip = token;
                    break;
            case 1: timestamp = token;
                    break;
            case 2: message = token;
                    break;
            default:
                // huch?
        }

        i++;
    } //while    
} //while
 
S

SlaterB

Gast
klingt ziemlich ähnlich zu
http://www.java-forum.org/datenbankprogrammierung/130772-csv-datei-einlesen-datenbank.html
in dem Sinne dass zu DB-Code bisher alles fehlt,
da kann man auch hier kaum mehr als auf Tutorials verlinken, oder jemand schreibt zufällig eine Komplettlösung dazu

----

ansonsten:
> Ich kann irgendwie nicht auf die Indizes der ArrayList zugreifen, um beispielsweise die IP-Adresse zu extrahieren

kannst du das auch näher erläutern? was geht denn an list.get(0) nicht?
welchen Code hast du mit welchen Fehlermeldungen oder sonstigen Problemen?

----

ein Konstrukt a la
Java:
                    //Read File Line By Line
                    while ((strLine = br.readLine()) != null)   {
        
                        // System.out.println (strLine);
                        
                        List<String> logList = new ArrayList<String>();
                        logList.add(strLine);
                        
                        Iterator<String> it = logList.iterator();
                        
                            while (it.hasNext()) {
macht natürlich auch für sich schon wenig Sinn,
nach Standard wird jede Zeile aus der Datei eingelesen, dann aber jeweils eine neue Liste erstellt,
der eine String eingefügt und die Liste in einer neuen Schleife durchlaufen,
wozu?
das könnte man sich sparen und gleich mit strLine weiterarbeiten,
bzw. wird ja auch gemacht, das it.next() aus der Liste wird nur einmal ausgegeben, sonst passiert nichts damit,

das ist unsinniger Code,
wenn das schon schwierig ist, dann wird komplexere DB natürlich noch viel schwieriger
 
M

maki

Gast
Ich würde da gar nicht lange frickeln um eine eigene, suboptimale Lösung zu erstellen, sondern gleich log4j oder besser logback nutzen, die bieten beide Appender für RDBMS.
 

mramaze

Mitglied
@KrokoDiehl: Danke für den Vorschlag. Ich werds mal veruschen so umzusetzen. Ich hab mir schon gedacht, dass das mit der Liste irgendwie unnötig ist. Aber ich hab mal mit nem Prof. darüber geredet und der hat mir diese Vorgehensweise vorgeschlagen und ich hab mich dann auf diese Variante festgefahren gehabt.

@SlaterB: DB-Code fehlt, weil ich ihn bisher noch nicht eingefügt habe. Aber der sollte dann das kleinere Übel sein.
Wenn der Index 0 ist, funktioniert das ganze, er gibt mir allerdings dann die gesamte Zeile in Tokens aus.

Java:
StringTokenizer tokenizer = new StringTokenizer(strLine);
    	    
    while (tokenizer.hasMoreTokens()) {

    	 tokenList = new ArrayList<String>();
         tokenList.add(tokenizer.nextToken());
    			 	

          System.out.println(tokenList.get(1));
    			 						

    	}

Das die erste Liste (logList) keinen Sin macht stimmt. Aber bei der TokenList wollt ich halt dann über die Indize auf die einzelnen Tokens zugreifen. Bei Index >= 1 bekomm ich ne IndexOutOfBoundException.

@maki:Ich will das LogFile eines Webservers auswerten (ich weiß es gibt unzählige LogFileAnalyzer, aber das ist erst der erste Schritt). Log4j bzw. Logback sind doch dazu da, um den eigenen Code mitzuloggen oder täusch ich mich da?
 
S

SlaterB

Gast
bei der tokenList gilt bisher praktisch dasselbe wie bei der logList, hatte ich noch nicht angeschaut:
wenn du INNERHALB der Schleife ständig eine neue Liste erzeugst und nur das aktuelle Element einfügst,
dann ist die Liste sinnlos

erzeuge die Liste nur VOR der tokenizer-Schleife und füge alle Elemente ein,
NACH der Schleife hast du dann hoffentlich mehrere Einträge und kannst mit verschiedenen Indexen, auch > 0, zugreifen
 

mramaze

Mitglied
Da hast du natürlich recht. Die Liste muss ich vor der Schleife erzeugen. Bei sowas bin ich immer viel zu leichtsinnig und pass nicht auf ;).

Aber KrokoDiehls Lösung funktioniert wunderbar.

Danke für eure Hilfe.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Socket.setSoTimeout -> BufferedReader -> Default value Allgemeine Java-Themen 4
kodela Unterschiedliches Verhalten von BufferedReader Allgemeine Java-Themen 3
D BufferedReader bricht nach 1248 Iterationen ab Allgemeine Java-Themen 14
C BufferedReader/BufferedWriter schreibt nicht alle Bytes Allgemeine Java-Themen 2
C TCP Server und BufferedReader Leerstring im Stream? Allgemeine Java-Themen 5
A BufferedReader ohne System.in Allgemeine Java-Themen 9
J BufferedReader Datei einlesen Allgemeine Java-Themen 8
Messoras Der BufferedReader mag mich nicht Allgemeine Java-Themen 47
C Threading mit BufferedReader/InputStream & sockets Allgemeine Java-Themen 0
J BufferedReader OutOfMemory umgehen? Allgemeine Java-Themen 10
B Input/Output BufferedReader Allgemeine Java-Themen 3
O BufferedReader von ganz unten anfangen zu lesen Allgemeine Java-Themen 7
S BufferedReader/PrintWriter an einer HTML Allgemeine Java-Themen 6
S Null Pointer Exception bei BufferedReader Allgemeine Java-Themen 4
K BufferedReader.readLine erkennt Zeilenende nicht Allgemeine Java-Themen 11
D 'InputStreamReader' & 'BufferedReader' führen zu "cannot find symbol"-Fehler Allgemeine Java-Themen 3
D Scanner leer aber bufferedReader nicht?! Allgemeine Java-Themen 2
A bufferedReader readline, encoding Allgemeine Java-Themen 5
V wie bufferedreader.readline() unterbrechen? Allgemeine Java-Themen 4
Developer_X Java BufferedReader mit URL Allgemeine Java-Themen 5
D BufferedREader#readLine Allgemeine Java-Themen 20
Semox Fehler - Zuweisung aus BufferedReader an Variable Allgemeine Java-Themen 3
S Exception beim BufferedReader Allgemeine Java-Themen 3
J BufferedReader br.readLine(); Allgemeine Java-Themen 22
G getFilePointer in BufferedReader? Allgemeine Java-Themen 2
D (BufferedReader) inLine() "verschluckt" zeilen ? Allgemeine Java-Themen 2
M BufferedReader.read(char[] cbuf) liefert falsche Werte? Allgemeine Java-Themen 4
W Frage zu BufferedReader Allgemeine Java-Themen 2
conan2 BufferedReader.readLine() von anderem Thread aus beenden Allgemeine Java-Themen 4
K Wie kann ich einen BufferedReader beschleunigen? Allgemeine Java-Themen 4
N readLine() von BufferedReader hält das Programm fest/auf! Allgemeine Java-Themen 10
B while mit BufferedReader beenden Allgemeine Java-Themen 5
F Zu große Werte beim byteweisen Lesen mit BufferedReader.read Allgemeine Java-Themen 5
S BufferedReader problem Allgemeine Java-Themen 11
D BufferedReader in image umwandeln Allgemeine Java-Themen 3
M BufferedReader input - hängt sich auf Allgemeine Java-Themen 4
C Probleme mit URL und BufferedReader Allgemeine Java-Themen 6
C BufferedReader oder DataInputStream Allgemeine Java-Themen 4
M Store a String in a BufferedReader Allgemeine Java-Themen 2
OnDemand Logfile pro User / Thread Allgemeine Java-Themen 7
C Logfile upload zu einem externen filezilla sftp server Allgemeine Java-Themen 6
T log4j2 Wo liegt mein Logfile? Allgemeine Java-Themen 3
B Garbage Collection Logfile: Binary File Allgemeine Java-Themen 2
B OOP java.util.logging.Logger: Wie kann ich mehre Klassen in ein Logfile schreiben lassen? Allgemeine Java-Themen 12
F Log Appender für neues Logfile Allgemeine Java-Themen 3
D Simples eigenes Logfile Allgemeine Java-Themen 18
B Aktuelle Zeit im Format YYYY-MM-DD HH-MM-SS in Logfile schre Allgemeine Java-Themen 8
S Logfile auswerten Allgemeine Java-Themen 2
J Logfile-Analyser für Java Allgemeine Java-Themen 6
V LogFile parsen Allgemeine Java-Themen 5
8u3631984 Bilder in Datenbank speichern - sinnvoll Allgemeine Java-Themen 5
S Kochbuch bzw. Rezepte-Datenbank app mit Swing..? Allgemeine Java-Themen 5
N relativier Pfad für sqlite-Datenbank in Gradle/IntelliJ Allgemeine Java-Themen 2
Avalon Data Transfer Objekte aus Datenbank erstellen Allgemeine Java-Themen 8
B API Token in Datenbank ablegen? Allgemeine Java-Themen 9
S Einzigartigen String in Datenbank finden und löschen Allgemeine Java-Themen 23
P Datenbank-MiniGUI fügt keine Daten ein Allgemeine Java-Themen 4
Q-bert Strings aus der JList in eine Datenbank speichern Allgemeine Java-Themen 1
Meeresgott Kapselung Tabellen der Datenbank erzeugen. Allgemeine Java-Themen 7
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
looparda Unit Test - Abgänigkeit zur Datenbank isolieren Allgemeine Java-Themen 3
T Datentypen MNIST Datenbank auslesen (.gz) Allgemeine Java-Themen 0
O 2 Combobox in Abhängigkeit von der 1 Combobox (Datenbank) Allgemeine Java-Themen 1
L Daten ohne Datenbank richtig abspeichern Allgemeine Java-Themen 5
M Objekt serialisieren/deserialisieren und in einer SQLite-Datenbank speichern Allgemeine Java-Themen 3
F OOP Datenbank-Klasse überall verfübar Allgemeine Java-Themen 2
R Test Umgebung für Datenbank erstellen, was braucht es? Allgemeine Java-Themen 14
D OOP Design Pattern für GUI - Datenbank Anwendung Allgemeine Java-Themen 1
T Zugriff auf Datenbank Allgemeine Java-Themen 1
G Datenbank von nöten? Allgemeine Java-Themen 7
3 Backup von h2-Datenbank-Datei erstellen Allgemeine Java-Themen 6
S Java DateTime für Datenbank Allgemeine Java-Themen 4
F Alternative sun.jdbc.odbc.JdbcOdbcDriver (Access Datenbank) Allgemeine Java-Themen 2
vandread Daten verschlüsseln mit Java oder Datenbank Allgemeine Java-Themen 15
P MYSQL Datenbank Dump einspielen Allgemeine Java-Themen 1
M SQL Datenbank in JAVA Projekt Allgemeine Java-Themen 3
P iTunes Datenbank manipulieren Allgemeine Java-Themen 2
A Ausführbare Java-Datei aus Projekt und Datenbank Allgemeine Java-Themen 3
T Datenbank oder Filesystem? (E-Learning) Allgemeine Java-Themen 2
N Datei aus Datenbank öffnen mit Standardanwendung Allgemeine Java-Themen 2
J Datenbank und OO-Aufsatz Allgemeine Java-Themen 9
P Klassen Template-Klasse für Datenbank-Abfragen erstellen Allgemeine Java-Themen 2
E JAVA Alternativen zur Datenbank? Allgemeine Java-Themen 7
Dit_ GeoKoordinaten Datenbank (nicht nur Städte) Allgemeine Java-Themen 6
J Progress Bar während Datenbank Erstellung Allgemeine Java-Themen 2
C Datenbank - Textfiles - Anderes Allgemeine Java-Themen 34
T Datenbank lässt sich un Entwicklungsumgebung öffnen, aus .jar aber nicht Allgemeine Java-Themen 9
G JNDI/LDAP/Datenbank Allgemeine Java-Themen 2
Meldanor Speichern der Datenbank - Lohnen sich mehrere Threads? Allgemeine Java-Themen 2
hdi [Free Download] Film-Datenbank Allgemeine Java-Themen 30
G Excel-Daten in Datenbank speichern - Problem mit leeren Feldern Allgemeine Java-Themen 7
K von List getSelected auf ResultSet Datenbank löschen Allgemeine Java-Themen 2
C Java Polling, Server Prozedur oder doch Datenbank? Allgemeine Java-Themen 4
H .dbf (IV) Datenbank einlesen Allgemeine Java-Themen 9
D Recipes / Codeschnipsel Datenbank für Java? Allgemeine Java-Themen 3
T MySQl Datenbank als Array ausgeben Allgemeine Java-Themen 11
M Rechenweg in Datenbank speichern und nutzen Allgemeine Java-Themen 6
O viele Datensätze aus Datenbank - Java Heap Space - Excepion Allgemeine Java-Themen 25
E Datenbank/iBatis Fehlermeldung Allgemeine Java-Themen 4
G Datenbank zur laufzeit wechseln Allgemeine Java-Themen 11

Ähnliche Java Themen

Neue Themen


Oben