Java Server Log Datei auswerten und in neue Datei schreiben

Bergfruehling

Lt. Junior Grade
Registriert
Juli 2008
Beiträge
496
Hallo,

mein Ziel ist es ein Server Log von bisher >175.000 Zeilen schnell auszuwerten.
Dazu sollen bestimmte Informationen gefiltert werden und in eine externe Datei als Art Datenbank/Tabelle gesichert werden.

Hier einmal ein Beispiel:

18:02:34 Player NAME_DES_SPIELERS connecting
18:02:37 Player NAME_DES_SPIELERS connected (id=00014580)
21:55:29 Mission MISSIONSNAME read from bank
10:46:40 Player NAME_DES_SPIELERS disconnected
10:46:40 All users disconnected, waiting for users

Am Anfang steht die Uhrzeit - unerheblich für mich.
Mich interessiert die Zeile
Player NAME_DES_SPIELERS connected (id=00014580)

Achtung: Es kann sein, dass mehrere Spieler die gleiche ID benutzen, deren Namen sollen der ID ebenfalls zugeordnet werden:

Bsp:
ID++++++++++++++++++++++Name
00014580+++++++++++++++++SpielerA, SpielerZ
153784+++++++++++++++++++SpielerC

Ob das Ganze als Excel oder HTML ausgegeben wird, ist mir egal.

So weit bin ich bisher:

Code:
package dateinzugriff2;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileReader;

public class Main {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
 
    try {
 
         BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
 
         System.out.println("*********************");
         System.out.println("***  Datenzugriff ***");
         System.out.println("*********************");
 
         System.out.println("Geben Sie die Art der gewünschten Meldung ein (Action | Warning | Error)");
         String Meldung;
         Meldung = input.readLine();
 
         String aktline = "";
         BufferedReader inFile = new BufferedReader (new FileReader ("log2302.txt"));
         aktline = inFile.readLine();
 
         while (aktline!= null)
         {
			String[] parts = aktline.split("");
            if (aktline.startsWith ()) && (aktline.endsWith ())  
// typische Zeile aus der Quelldatei: 18:07:07 Player SpielerC connected (id=10250000)
            {
            System.out.println(aktline);
            }
            aktline = inFile.readLine();   
         }
         inFile.close();
 
    }
 
        catch(Exception ex)
         {
  System.out.println("Irgendwas ist schief gelaufen !!!");
 
  System.out.println(ex.getMessage() );
 
       }
 
        // TODO code application logic here
    }
 
}

Ich brauche Hilfe bei dem Filter und der Ausgabe. Anregungen sind mir willkommen.
 
Zuletzt bearbeitet:
Schau dir mal die Klassen "Pattern" und "Matcher" an. Zusammen mit der substring-Methode von "String" solltest du alles hinkriegen, was du brauchst.
 
Wenn es Dir nur auf das Ergegnis ankommt, dann könntest du auf Kommandoebene mit fgrep einfach die Zeilen filtern. Dann kannst du dir das Javaprogramm sparen.
 
So, weils gerade langweilig war, hab ich mal ein entsprechendes Programm getippt. Die Ausgabe musste dir halt entsprechend formatieren...

Falls du dir die Lösung selbst erarbeiten willst, dann halte dich an Pattern und Matcher, damit hab ich es letzendlich gelöst :)

Code:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GameLogParser {

	// ==================================================================================================
	// {[> Attributes
	// ==============
	private Hashtable<String, ArrayList<String>> data = new Hashtable<String, ArrayList<String>>();



	// ==================================================================================================
	// {[> Initializers and Constructors
	// =================================
	public GameLogParser() {
		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("log.txt"))));
			String line;
			Matcher m;
			Pattern p = Pattern.compile(".*Player (\\w+) connected \\(id=(\\d+)\\)");
			while ((line = reader.readLine()) != null) {
				m = p.matcher(line);
				if (m.find()) {
					addUser(m.group(2), m.group(1));
				}
			}
			reader.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

		// Lesen der Datei abgeschlossen, nun wird das Ergebnis ausgegeben
		StringBuilder sb = new StringBuilder();
		ArrayList<String> list;
		for (String id : data.keySet()) {
			sb.setLength(0);
			list = data.get(id);
			for (String user : list) {
				if (sb.length() != 0) {
					sb.append(", ");
				}
				sb.append(user);
			}
			sb.insert(0, id + ".............");
			System.out.println(sb.toString());
		}
	}



	// ==================================================================================================
	// {[> Static Methods
	// ==================
	public static void main(String[] args) {
		new GameLogParser();
	}



	// ==================================================================================================
	// {[> Methods
	// ===========
	private void addUser(String id, String user) {
		ArrayList<String> list;
		if (data.containsKey(id)) {
			list = data.get(id);
			if (!list.contains(user)) {
				list.add(user);
			}
		} else {
			list = new ArrayList<String>();
			list.add(user);
			data.put(id, list);
		}
	}
}
 
Ich komme leider nicht weiter.

Wie ich die Daten Strings als html ausgebe (Formatierung), dabei auch noch beachten muss, dass eine vorhandene ID nicht mehrfach in die Liste geschrieben wird, sondern immer neue Namen der ID zugeordnet werden.

Vielleicht kann mir jemand noch einmal helfen.
 
... Schau dir doch meine Antwort an, da wird bereits berücksichtig, dass gleiche IDs mit unterschiedlichen Namen existieren können.
 
Zurück
Oben