# ServerLog auslesen und Statistik erstellen



## Fire_X (12. Apr 2012)

Hallo Liebe Java Freunde,

ich mache zur Zeit eine Ausbildung zum IT-Systemelektroniker. Wir lernen in der Berufsschule zur Zeit die Programmiersprache Java. 
Nun haben wir eine Hausaufgabe bekommen in der wir einen ServerLog auslesen sollen und die Anzahl von z.B Errors Statistisch darstellen sollen. 
Da ich mittlerweile mich schon durch ettliche Bücher, Foren und diesem Forum per Suchfunktion gekämpft habe, verstehe ich nichts mehr ???:L:autsch:
Mein Problem ist es, wie kann ich erreichen das ein String, der aus Unterschiedlichsten Zeichen besteht mir eine Statistik liefern kann, in der ich sofort erkennen kann was wie oft vorgekommen ist.

Hier einmal ein paar Zeilen aus dem ServerLog:

01/31/05;11:56:38;__init__;DEBUG; 404 because file does not exist: h:\Programmierung\python\snakelets\webapps\ROOT\favicon.ico
01/31/05;12:21:08;__init__;INFO; sendfile(2) is NOT available; compatible but slower file serving is used
01/31/05;12:21:09;__init__;WARNING; Defaulting to loading all available web apps to the current host.
01/31/05;12:21:09;__init__;WARNING; \NOTICE: VirtualHost configuration is NOT enabled.

Bisher habe ich folgenden Code.

```
import java.io.*;
import java.lang.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileReader;

/**
 *  ServerLog Datei Auslesen
 *  Programmiert by
 */

public class ServerLog{

       public static void main(String args[]) throws IOException
       {
         String Zeile;
         int eingabe;
         BufferedReader leseStream = new BufferedReader (new FileReader("Server.log"));

         System.out.println("***************************************************************************");//Zeile für ein ansprechendes Optisches Design
         System.out.println("************                                                    ***********");
         System.out.println("************               Auflistung der Eingabe               ***********");//Hier werden dem User der möglichen Eingaben aufgelistet
         System.out.println("************                                                    ***********");
         System.out.println("************             Fuer INFO bitte 1 eingeben             ***********");
         System.out.println("************                                                    ***********");
         System.out.println("************            Fuer DEBUG bitte 2 eingeben             ***********");
         System.out.println("************                                                    ***********");
         System.out.println("************          Fuer WARNING bitte 3 eingeben             ***********");
         System.out.println("************                                                    ***********");
         System.out.println("************            Fuer ERROR bitte 4 eingeben             ***********");
         System.out.println("************                                                    ***********");
         System.out.println("***************************************************************************");
         System.out.println("***************************************************************************");
         System.out.println("************                                                    ***********");
         System.out.println("************                                                    ***********");
         eingabe=IO.readInt("                    Tätigen Sie bitte Ihre Eingabe: "); //Eingabe des Users

         while ( (Zeile = leseStream.readLine()) != null) {

               String s = Zeile;


               if (eingabe == 1) {                                                   //Hier wird mittels If Bedinungen geprüft welche Eingabe der User getroffen hat

               }
               
               if (eingabe == 2) {

               }
               
               if (eingabe == 3) {

               }
               
               if (eingabe == 4) {

               }
         }

       }

}
```


----------



## Gast2 (12. Apr 2012)

Und wie genau lautet deine Frage?


----------



## Fire_X (12. Apr 2012)

Ups, dagehts schon los, bin zu verwirrt 

Meine Frage, wie muss der Code aussehen, damit wenn z.B der User "1" eingibt um eine Statistik über die Anzahl der INFO´s im ServerLog zu bekommen.

Habe es schon mit mehreren sachen (indexOf, replace, trimm) aber nicht das rausgekommen, was ich haben wollte.


----------



## Fab1 (12. Apr 2012)

Du hast einen String, den willst du mit "==" mit einer Zahl vergleichen das funktioniert allerdings so nicht.

Entweder du parst den String in ein int. Oder du vergleichst den String mit equals() mit einem anderen String.

Variablen gehören klein


----------



## Fire_X (12. Apr 2012)

Fab1 hat gesagt.:


> Du hast einen String, den willst du mit "==" mit einer Zahl vergleichen das funktioniert allerdings so nicht.
> 
> Entweder du parst den String in ein int. Oder du vergleichst den String mit equals() mit einem anderen String.
> 
> Variablen gehören klein



Ehm... Ich vergleiche in der If Bedingung keinen String.
Entweder Denke ich jezt falsch oder du hast dich da falsch ausgedrückt


----------



## Fab1 (12. Apr 2012)

Fire_X hat gesagt.:


> Ehm... Ich vergleiche in der If Bedingung keinen String.
> Entweder Denke ich jezt falsch oder du hast dich da falsch ausgedrückt



Oh Entschuldigung, da hab ich mich aber kräftig verschaut



> damit wenn z.B der User "1" eingibt um eine Statistik über die Anzahl der INFO´s im ServerLog zu bekommen.



Was meinst du genau mit Statistik?



> über die Anzahl der INFO´s im ServerLog



So wie es in deinem ersten Post aussieht, entspricht eine Zeile einer Info, somit müsstest du ja nur die vorhandenen nicht leer Zeilen zählen und dir merken. Wenn es überhaupt so gewollt ist, steh grade noch bisschen auf dem Schlauch.


----------



## Fire_X (12. Apr 2012)

nunja, mit statistik ist gemeint, dass zb. in dem Serverlog 100x der Eintrag Info zu finden ist.
Also dass mir dieses Nette Programm alle Zeilen mit INFO nach der Uhrzeit/Datum zählt und diese dann ausgiebt.
Also:
Die Anzahl der Systemmeldungen "Info" beträgt: x-Mal


----------



## Fab1 (13. Apr 2012)

Also Zeile einlesen auf "Info" überprüfen wenn ja, dann Variable um 1 erhöhen, wenn nein "nichts machen"

Schau mal in der SuFu dazu gibt es einige Beispiele.


----------



## Fire_X (13. Apr 2012)

Ok.. entweder bin ich zu Doof oder ich verstehe deine Aussage nicht ganz,
wenn ich nach Solchen Schlüsselwörten suche, finde ich nie das was ich brauch.
Könntest du deine Aussage bitte genauer erläutern?


----------



## Fab1 (13. Apr 2012)

Ich hab ja auch so das Gefühl, dass wir uns missverstehen.

Und so recht weiß ich auch nicht, woher du 
	
	
	
	





```
IO
```
bekommst, ich war einfach mal so frech und es an meine Kenntnisse angepasst.

So der Code steht unten. Zur Erklärung ich hab ein paar Sachen geändert. Klassenname oder Namen der Datei musst du dann einfach wieder anpassen, sonst kannst du den Code nämlich nicht ausführen.

Also wenn die Textdatei (Server.log) so aufgebaut ist, wie von dir beschrieben, dann sollte alles funktionieren.

So nun meine Vorgehensweise:

Am Anfang wird die Benutzereingabe abgefragt und diese anschließend in ein Int geparst. Anschließend wird überprüft, welche Zahl eingegeben wurde. Und entsprechend wird das Wort "zuPruefendeWort" geändert, nach dem gesucht werden muss (ERROR, INFO etc.)

Anschließend wird die Textdatei Zeile für Zeile durchlaufen. Und jede Zeile wird bei ";" gesplittet.
Das bedeutet, dass in einem String Array einzelne Teile der Zeile gespeichert werden. 

Da die Textdatei wie von dir beschrieben aufgebaut ist, bekommt man, wenn man den Index 3 von dem String Array anspricht immer die Art der Statistik (Info, Error, etc).
Ein Array arbeitet mit Index. Ein Index beginnt immer mit 0, somit wäre das der erste Teil der Zeile.


Genau diese Art braucht man natürlich, denn mit dieser muss man das zuPruefendeWort vergleichen. Strings vergleicht man mit Equals, da ein String ein Objekt und kein primitiver Datentyp wie zum Beispiel int ist.

Haben wir einen Treffer, also sind beide Strings gleich, dann wird eine Variable hochgezählt. 

Diese Variable wird am Schluss ausgegeben. Und alle sind hoffentlich glücklich. :toll:

Ich hoffe ich konnte dir damit helfen.



Spoiler:  der Code





```
import java.io.*;
import java.lang.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileReader;
 
/**
 *  ServerLog Datei Auslesen
 *  Programmiert by
 */
 
public class Test{
 
       public static void main(String args[]) throws IOException
       {
         String zeile;
         String zuPruefendeWort ="";
         int anzahlDaten = 0;
         String eingabeString;
      
         BufferedReader leseStream = new BufferedReader (new FileReader("text.txt"));
 
         System.out.println("***************************************************************************");//Zeile für ein ansprechendes Optisches Design
         System.out.println("************                                                    ***********");
         System.out.println("************               Auflistung der Eingabe               ***********");//Hier werden dem User der möglichen Eingaben aufgelistet
         System.out.println("************                                                    ***********");
         System.out.println("************             Fuer INFO bitte 1 eingeben             ***********");
         System.out.println("************                                                    ***********");
         System.out.println("************            Fuer DEBUG bitte 2 eingeben             ***********");
         System.out.println("************                                                    ***********");
         System.out.println("************          Fuer WARNING bitte 3 eingeben             ***********");
         System.out.println("************                                                    ***********");
         System.out.println("************            Fuer ERROR bitte 4 eingeben             ***********");
         System.out.println("************                                                    ***********");
         System.out.println("***************************************************************************");
         System.out.println("***************************************************************************");
         System.out.println("************                                                    ***********");
         System.out.println("************                                                    ***********");
         System.out.println("                    Tätigen Sie bitte Ihre Eingabe: "); //Eingabe des Users
        
         BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
         
         eingabeString = console.readLine();
         
         // parsen
         int eingabeInt = Integer.parseInt(eingabeString);
         
         //System.out.println("Eingabe:" + eingabeInt);
         
         
         if (eingabeInt == 1) {                                                   //Hier wird mittels If Bedinungen geprüft welche Eingabe der User getroffen hat
      	   System.out.println("Es wurde 1 eingegeben, die INFO Statistik wird angezeigt");
      	 zuPruefendeWort = "INFO";
         }
         
         if (eingabeInt == 2) {
      	   System.out.println("Es wurde 2 eingegeben, die DEBUG Statistik wird angezeigt");
      	 zuPruefendeWort = "DEBUG";
         }
   
         if (eingabeInt == 3) {
      	   System.out.println("Es wurde 3 eingegeben, die WARNING Statistik wird angezeigt");
      	 zuPruefendeWort = "WARNING";
         }
         
         if (eingabeInt == 4) {
      	   System.out.println("Es wurde 4 eingegeben, die ERROR Statistik wird angezeigt");
      	 zuPruefendeWort = "ERROR";
         }
         if(eingabeInt >4 || eingabeInt <1){
      	   System.out.println("Die Eingabe war falsch, bitte starten Sie das Programm neu");
      	   System.exit(0);
         }
         
         while ( (zeile = leseStream.readLine()) != null) {
 
              String [] teile = zeile.split(";");
              //System.out.println(teile[3]);
              if(teile[3].equals(zuPruefendeWort)){
            	  anzahlDaten++;
              }
          
         }
         //Statistik wird ausgegeben
         System.out.println("Die Statistik besagt, dass die " + zuPruefendeWort + " Statistik eine Anzahl von " + anzahlDaten + " besitzen");
 
       }

}
```


----------



## Fire_X (13. Apr 2012)

Vielen Dank, jezt haben wir uns verstanden 

Ich DANKE dir! :toll:


----------

