Datei lesen ohne sie für umbenennen/verschieben zu sperren

dermoritz

Bekanntes Mitglied
Gibt es eine Möglichkeit eine (Log)-Datei zu lesen ohne anderen Prozess zu verbieten dies umzubenennen?

Die Problematik ist folgende: ich brauche eine Art Echtzeit-Log-Auswerter. Bestimmte Prozesse (3rd Party, nicht Java) schreiben Log-Dateien und benennen sie manchmal um. Nun will ich diese Dateien lesen während sie beschrieben werden ohne das schreibende Programm zu hindern diese umzubenennen. In Java würde falls es geht dann eine File-Not-Found Exception geworfen die man entsprechend fangen könnte.

Geht das irgendwie?
 
Nein, und das liegt nicht an Java sondern am Betriebssystem -> Sicherheit
In und Outputstreams darf es nur einmal geben.

Es sei denn es handelt sich bei den Schreibern auch um Java-Programme. Ich meinte mal gehört zu haben, dass das dann trotzdem funktioniert...
 
Vielen Dank,

gibt es denn wenigstens Möglichkeiten die Zeit in der eine Umbenennung unmöglich ist zu minimieren? Beim parsen von Log-Dateien will man ja eigentlich immer nur die letzte Zeile lesen.
Wenn man nur die letzte Zeile lesen würde oder die ganze Datei in den Speicher kopieren würde und dann darauf rumliest wäre diese Zeit schon recht klein oder?

Der Use-Case (lies Log-Dateien während sie geschrieben werden, welche sicher immermal umbenennen könnten) an sich sollte sehr geläufig sein. Ich hab gedacht da sollte es schon einige Lösungen geben?!
 
ich bezweifle dass es einen sinnigen Use case gibt bei den ein aktives Log file mal eben kurz umbenannt wird. In einer aktiven Applikation mal so eben das Log file umzunennen find ich mehr als befremdlich.

Unter welchem System läuft das denn ? vielleicht reicht schon ein einfaches [c]tail [-f][/c]
 
Es gibt Programme die ihre eigenen Logdateien je nach eingestellter Größe umbenennen. In meinem Fall sind es irgend welche Windows-Programme deren Arbeit ich überwachen muss.
Wann die einzelnen Programme Log-Dateien umbenennen habe ich nicht in der Hand. Ich weiß noch nicht einmal wie sie reagieren falls die Umbenennung fehlschlägt (von ignorieren und weiter schreiben bis unhandled Exception ist da alles drin). Mein Überwachungstool soll eben möglichst unbemerkt und aktuell die Logdateien auswerten.
 
halte ich immer noch für ziemlich fragwürdig... aber bygones

du musst natürlich wissen wie dann die neuen Logfiles heißen... dann kannst du wie du schon schreibst das Logfile analysieren und wenn der fehler kommt dann reagierst du und analyisierst das neue....
 
Wie willst du eine Datei in den Cache einlesen, wenn du nichtmal ein Stream dazu aufbauen kannst? ???:L

Wir wissen auch nicht ob die Programme ihre Streams überhaupt schließen! Evt. bleiben diese ja bis zum Beenden geöffnet...
Du kannst nur versuchen in einer fortlaufenden Schleife auf die Datei zuzugreifen... jedesmal wenns schiefläuft wieder versuchen... wenn du etwas auslesen kannst hast du geschafft.
 
Die Frage war ja aber wohl weniger, wie man mit dem Problem umgeht, dass man Dateien von Java aus nicht lesen kann, während sie gerade umbenannt werden. Umgekehrt: wie verhindert man, dass andere Programme auf Schreibfehler laufen, weil das Java-Porgramm ihr Logfile liest, während das Fremdprogramm das Log-File gerade umbenennen will. Das läuft aber darauf hinaus, wie Schreiboperationen möglich sind, obwohl die Datei gerade gelesen wird. Und das wird in Java unter Windows so wohl nicht gehen.
 
Danke Murray genau das meinte ich. Es scheint für Windows aus meiner Sicht nur 2 Workarounds zu geben:

1. Man kennt den Umbenennalgorithmus und bendet das Lesen kurz vor der Umbenennung. Das Problem ist hier die Zeitspanne zwischen Lesestopp und wahrer Umbenennung. Falls wie in meinem Fall die Umbenennung auf Dateigröße basiert, kann diese Spanne beliebig lang sein.

2. Man verzichtet auf Aktualität und liest nur umbenannte Logdateien (leider keine Option für mich).

Hat noch irgendwer andere Ideen?
 
Du kannst doch auch in Java folgendes machen
Java:
Process process = Runtime.getRuntime().exec("tail -f <logfile>")
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

    String temp = null;
    while ((temp = reader.readLine()) != null){
      System.out.println(temp);
    }

Somit kannst du das log überwachen und es kann gleichzeitig weiter befüllt werden
 
Du kannst doch auch in Java folgendes machen
Java:
Process process = Runtime.getRuntime().exec("tail -f <logfile>")
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));

    String temp = null;
    while ((temp = reader.readLine()) != null){
      System.out.println(temp);
    }

Somit kannst du das log überwachen und es kann gleichzeitig weiter befüllt werden

Es geht nicht ums befüllen sondern ums umbenennen. Und da macht es keinen Unterschied ob nun Java oder Tail die Datei geöffnet hält.
 
Kannst du nicht eine Kopie des Logs erstellen und auf der Datei arbeiten / diese lesen?

Dann in bestimmten Abständen die Kopie aktualisieren.
 

Neue Themen


Zurück
Oben