# *.log File durchsuchen



## Peterle (7. Apr 2004)

Hallo Leute

Wie kann ich ein *.log File öffnen und dieses nach einem bestimmten String durchsuchen!

ich versuchte es mit einem Filereader aber ich bekam immer folgende Fehlermeldung:

" (Die Syntax fⁿr den Dateinamen, Verzeichnisnamen oder die DatentrΣgerbezeichnun
g ist falsch)"


kann mir bitte jemand ein Beispiel aufzeigen mit dem das klappt?



Danke euch schon mal vorab!


----------



## bygones (7. Apr 2004)

```
BufferedReader in  = new BufferedReader(new FileReader("meineDatei")); // <- Streams zum lesen wird geöffnet
String line; // <- wird die einzelnen Zeilen speichern
String suchString = "hallo"; // <- String den du suchst


while((line = in.readLine() != null) { // <- es wird solange zeilenweise eingelesen bis nix mehr da ist
  if(line.indexOf(suchString) != -1) { // <- suchString wurde gefunden
    // mach irgendwas mit line oder so
  }
}

in.close();
```

Wäre ein Bsp    achja, das ganze kann eine IOException werfen !


----------



## Peterle (7. Apr 2004)

danke dir für deine schnelle antwort! probiere es gleich mal aus


----------



## Peterle (7. Apr 2004)

Sorry aber *deathbyaclown* das funktioniert nicht!

bekomme wieder die Fehlermeldung!

" (Die Syntax fⁿr den Dateinamen, Verzeichnisnamen oder die DatentrΣgerbezeichnung ist falsch)" 

kann mir sonst noch jemand helfen?

hänge jetzt schon 5 stunden mit dem Problem herum!

finde auch nirgendwo etwas, wie man explizit "*.log"-files lesen kann!


----------



## P3AC3MAK3R (7. Apr 2004)

In welcher Form hast Du den Dateinamen denn überhaupt angegeben?


----------



## Mick (7. Apr 2004)

Peterle hat gesagt.:
			
		

> ich versuchte es mit einem Filereader aber ich bekam immer folgende Fehlermeldung:
> 
> " (Die Syntax fⁿr den Dateinamen, Verzeichnisnamen oder die DatentrΣgerbezeichnun
> g ist falsch)"



Und welches Prog gibt Dir so eine Fehlermeldung aus? Nach ner Exception sieht das nicht aus. Beschreib am besten Deine ganze Umgebung und poste den relevanten Code. Dann kann man Dir auch helfen!

Grüße,
Mick


----------



## cello (7. Apr 2004)

Hast du das file vielleicht in einer *.jar-Datei. Zum Testen kannst du die Datei (die Logdatei) ja erstmal auf c:/ oder ~/ legen, damit du ausschließen kannst, dass die Pfadangabe falsch ist.


----------



## bygones (7. Apr 2004)

Sorry - das kann keine Exception von Java sein - jedenfalls schmeißt mein Java keine Deutschen Exceptions.....


----------



## Peterle (7. Apr 2004)

*Umgebung:*
Betriebssystem: Win XP
Arbeite mit Jbuilder 9
starte das Programm mit Cmd prompt

*Programm*
das Programm soll alle log files in einem angegebenen Ordner und unterordner raussuchen und diese nach einem bestimmten vorgegebenen String durchsuchen!
wird der string gefunden soll der Dateiname ausgeben werden!

die log dateien liegen in einem lokalen Verzeichnis (nicht gepackt!!)



```
import java.io.*;

public class searchString {

  public static void searchFile(String file, String zeichen){
    try{
      //soll datei öffenen und nach Zeichen durchsuchen!
      BufferedReader in  = new BufferedReader(new FileReader(new File(file)));// <- Streams zum lesen wird geöffnet
      String line; // <- wird die einzelnen Zeilen speichern
      while((line = in.readLine()) != null) { // <- es wird solange zeilenweise eingelesen bis nix mehr da ist
        if(line.indexOf(zeichen) != -1) { // <- suchString wurde gefunden
          // mach irgendwas mit line oder so
          outputFounded(file);
        }
      }

      in.close();
    }
    catch (IOException e){
      System.out.println(e.getMessage());
    }
  }

  private static void outputFounded(String file){
    //gibt die Datei aus, wenn sie das/die Zeichen enthält
    System.out.println(file);
  }
```


```
import java.io.*;

//diese Klasse gibt mir alle gültigen Files einer Klasse wieder!
//wenn es noch unterordner gibt, dann soll ein neuer thread erzeugt werden, der das abarbeitet
public class getValidFiles {

  public void listAllFiles(String folder, String zeichen, String typ){
    String str = "";
    File file = new File(folder);
    //VerzeichnisListe
    if(file.isFile()){

    }
    else{
      String[] fileList = file.list();
      int length = fileList.length;
      int fileOK = 0;
      //Thread instanzierung
      threadedGetValidFiles tgvf;
      threadedSearchString tss;
      //schleifensteuerung aller gefundenen Files
      for(int i = 0; i < length; i++){
        fileOK = listElementCheck((folder+"\\"+fileList[i]), typ);
        //prüfe es sich um ein Verzeichnis oder eine gültiges File handelt!
        if(fileOK == 2 ){
          tss = new threadedSearchString();
          tss.startThread(folder+"\\"+fileList[i]+"\n", zeichen);
        }
        //durchsuche die unterordner indem du einen neuen Thread startest!
        if( fileOK == 1){
          tgvf = new threadedGetValidFiles();
          tgvf.startThread(folder+"\\"+fileList[i], zeichen, typ);
        }
      }
    }
  }

  public static int listElementCheck(String elementName, String fileType){
    //prüft nach ob es sich um ein File oder ein Directory handelt!
    //0.. kein typ, 1.. Folder, 2.. File des typs
    int type = 0;
    File file = new File(elementName);

    if(file.isDirectory()){
      type = 1;
    }
    else if(file.isFile() && file.getName().endsWith(fileType)){
       type = 2;
    }
    return type;
  }

}
```

Eingabe class


```
import java.io.*;

class search {
  //Eingabe-Variablen definieren
  static String folder, zeichen, eMail;
  static String typ = ".log";

  public static void main(String[] args) throws IOException {
    //start der eingabe
    inputForm();
    //suche aller gültigen Files
    returnAllValidFiles();
  }

  public static void inputForm()
      throws IOException{
    //InputReader definieren
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    //EingabeText
    System.out.println( "=====================================================\n" +
        "Willkommen bei der String-Suche in einem Verzeichnis\n" +
        "=====================================================\n" +
        "Bitte geben Sie exakt die Zeichenkette an, nach der\n" +
        "die '*.log' Files durchsucht werden sollen.\n" +
        "Das Verzeichnis hat das Format: c:\\folder\\folder\\..\n" +
        "Die eMail muss ein gültiges Format haben:\n" +
        "\tz.B.:\t'vorname.name@siemens.de'\n" +
        "=====================================================\n" +
        "\n\nBitte geben Sie das Verzeichnis an: ");
    folder = br.readLine();
    System.out.println("\nBitte geben Sie die Zeichenkette an:  ");
    zeichen = br.readLine();
    System.out.println("\nBitte geben Sie die Email an:  ");
    eMail = br.readLine();
    System.out.println(
        "*****************************************************\n" +
        "Danke fuer ihre Eingabe, das Ergebnis wird an diese \n" +
        "eMail uebermittelt, wenn etwas gefunden wurde!\n" +
        "*****************************************************\n" +
        "\tCopyright Peter Suess, 2004\n\n\n");
  }
  public static void returnAllValidFiles(){
    System.out.println("\n*************************************\n" +
    "************** AUSGABE **************\n");
    File f = new File(folder);
    threadedGetValidFiles tvgf;
    //wenn Verzeichnis existiert dann mache weiter, sonst ende
    if (f.isDirectory() || (f.isFile() && f.getName().endsWith(".log"))) {
    //threads starten!
      tvgf = new threadedGetValidFiles();
      tvgf.startThread(folder, zeichen, typ);
    }
    else {
      System.out.println(
          "Sie haben einen ungueltigen Verzeichnis- bzw. Filenamen angegeben\n" +
          "\tVerzeichnis bzw. File: " + folder + "\n" +
          "*************************************");
    }

  }

}
```

und der pfad den ich eingebe lautet c:\test\log
dort liegen die log files mit dem namen (access.log und jvm.log)

und das ist die meldung die mir ausgegeben wurde! (im cmd)


> *************************************
> ************** AUSGABE **************
> c:\test\log\access.log
> (Die Syntax fⁿr den Dateinamen, Verzeichnisnamen oder die DatentrΣgerbezeichnun
> ...


----------



## bygones (7. Apr 2004)

was ist "threadedGetValidFiles" & "threadedSearchString()" ?

PS: Klassennamen werden in Java immer mit Großbuchstaben begonnen !!


----------



## Mick (7. Apr 2004)

Und wo wird diese Fehlermeldung erzeugt? In einer anderen Klasse?

Die Syntax fⁿr den Dateinamen, Verzeichnisnamen oder die DatentrΣgerbezeichnun 
g ist falsch


----------



## Peterle (7. Apr 2004)

> was ist "threadedGetValidFiles" & "threadedSearchString()" ?
> 
> PS: Klassennamen werden in Java immer mit Großbuchstaben begonnen !!


das sind meine Thread-Klassen um eine schnellere abarbeitung zu bewerkstelligen!
*grossbuschtaben! ok werde es mir merken!



> Und wo wird diese Fehlermeldung erzeugt? In einer anderen Klasse?
> 
> Die Syntax fⁿr den Dateinamen, Verzeichnisnamen oder die DatentrΣgerbezeichnun
> g ist falsch



diese exception wird in der Klasse:

```
import java.io.*; 

public class searchString { 

  public static void searchFile(String file, String zeichen){ 
    try{ 
      //soll datei öffenen und nach Zeichen durchsuchen! 
      BufferedReader in  = new BufferedReader(new FileReader(new File(file)));// <- Streams zum lesen wird geöffnet 
      String line; // <- wird die einzelnen Zeilen speichern 
      while((line = in.readLine()) != null) { // <- es wird solange zeilenweise eingelesen bis nix mehr da ist 
        if(line.indexOf(zeichen) != -1) { // <- suchString wurde gefunden 
          // mach irgendwas mit line oder so 
          outputFounded(file); 
        } 
      } 

      in.close(); 
    } 
    catch (IOException e){ 
      System.out.println(e.getMessage()); 
    } 
  } 

  private static void outputFounded(String file){ 
    //gibt die Datei aus, wenn sie das/die Zeichen enthält 
    System.out.println(file); 
  }
```
erzeugt. innerhalb der try catch schleife!

wo das "Catch" die meldung schmeisst!


----------



## Peterle (7. Apr 2004)

deathbyaclown hat gesagt.:
			
		

> was ist "threadedGetValidFiles" & "threadedSearchString()" ?
> 
> PS: Klassennamen werden in Java immer mit Großbuchstaben begonnen !!



danke für den tipp

habs gerade angepasst!


----------



## P3AC3MAK3R (7. Apr 2004)

> erzeugt. innerhalb der try catch *schleife*


Sagst Du auch if-Schleife? :noe:


----------



## Peterle (7. Apr 2004)

habe mal genau getestet was alles in der Try schleife ausgeführt wird und ab wann die exception kommt!

```
import java.io.*;

public class SearchString {

  public static void searchFile(String file, String zeichen){
    System.out.println("vor try catch");
    try{
      //soll datei öffenen und nach Zeichen durchsuchen!
      System.out.println("BufferedReader");
      BufferedReader in  = new BufferedReader(new FileReader(new File(file)));// <- Streams zum lesen wird geöffnet
      String line; // <- wird die einzelnen Zeilen speichern
      System.out.println("vor der while-schleife");
      while((line = in.readLine()) != null) { // <- es wird solange zeilenweise eingelesen bis nix mehr da ist
        System.out.println("vor if schleife und in while Schleife");
        if(line.indexOf(zeichen) != -1) { // <- suchString wurde gefunden
          System.out.println("innerhalb der if schleife!");
          // mach irgendwas mit line oder so
          outputFounded(file);
          System.out.println("execption is in der Try schleife");
        }
      }

      in.close();
    }
    catch (IOException e){
      System.out.println("Catch: "+e.getMessage());
    }
  }

  private static void outputFounded(String file){
    //gibt die Datei aus, wenn sie das/die Zeichen enthält
    System.out.println(file);
  }

}
```
und das ist die Fehlermeldung dazu:


> vor try catch
> BufferedReader
> Catch: c:\test\log\access.log
> (Die Syntax fⁿr den Dateinamen, Verzeichnisnamen oder die DatentrΣgerbezeichnun
> ...



==> der Buffered Reader erzeugt die exception!


----------



## bygones (7. Apr 2004)

Dann gib dir mal den String file aus - da muss dann der Haken sein....


----------



## Peterle (7. Apr 2004)

P3AC3MAK3R hat gesagt.:
			
		

> > erzeugt. innerhalb der try catch *schleife*
> 
> 
> Sagst Du auch if-Schleife? :noe:


entschuldige war keine absicht!

=> es wird erzeugt innerhalb des try-catch


----------



## Roar (7. Apr 2004)

try-catch-block <-  :!: 
if-block  :!: 
und lass dir dochmal den stacktrace ausgeben...


----------



## Peterle (7. Apr 2004)

Roar hat gesagt.:
			
		

> try-catch-block <-  :!:
> if-block  :!:
> und lass dir dochmal den stacktrace ausgeben...





> vor try catch
> BufferedReader
> c:\test\log\access.log
> 
> ...



hier der Stacktrace


----------



## Mick (7. Apr 2004)

Peterle hat gesagt.:
			
		

> > Und wo wird diese Fehlermeldung erzeugt? In einer anderen Klasse?
> >
> > Die Syntax fⁿr den Dateinamen, Verzeichnisnamen oder die DatentrΣgerbezeichnun
> > g ist falsch
> ...



Da steht, dass im Exception-Falle folgendes ausgegeben werden soll:
"e.getMessage". Da e eine IOException ist, kommt es mir seeeeehr komisch vor, dass die eine deutsche Fehlerbeschreibung ausgibt. Das muss meiner Meinung nach noch wo anders herkommen. Oder ist die Meldung gar nicht vom Stacktrace?


----------



## Peterle (7. Apr 2004)

*DANKE ALLEN FÜR DIE SUPER HILFE UND MÜHEN!*  
es lag am String!

der input String war: "c:\test\log" 


> richtig:
> "c:\\test\\log"



blos der Fehler dabei ist, dass im String selber das "\" mit "\\" geschrieben werden muss, sonst gibt es Probleme!

habe das jetzt behoben und werde die String erkennung über die Eingabe verbessern, damit die String-Literale angezeigt werden!

 :toll: und danke nochmals!


Grüße an alle und noch schöne Ostern

Peter


----------



## P3AC3MAK3R (7. Apr 2004)

Da ist mein Posting dann wohl untergegangen.



> In welcher Form hast Du den Dateinamen denn überhaupt angegeben?


----------

