Die Log-Datei einer anderen Anwendung in Echtzeit überwachen

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Vultrax.

    Die Log-Datei einer anderen Anwendung in Echtzeit überwachen

    Wie man schon am Titel erkennen kann, möchte ich die Log-Datei einer anderen Anwendung in Echtzeit überwachen. Durch meine Google-Suche habe ich erfahren, dass man dafür einen FileSystemWatcher verwenden muss, allerdings habe ich ein Problem mit der genannten Log-Datei festgestellt, wodurch ich diesen nicht verwenden kann. Das Problem ist, dass die Log-Datei NUR von der anderen Anwendung aktualisiert wird, wenn man einen Rechtsklick auf diese macht, dadurch feuert logischerweise auch nicht das "Changed"-Ereignis von dem FileSystemWatcher.

    Kann man diese Log-Datei jetzt irgendwie permanent aktualisieren lassen? Oder gibt es noch einen vollkommen anderen (besseren) Weg, um diese zu überwachen?
    Es ist sehr wichtig, dass das in Echtzeit passiert, weil kein Log-Ereignis verpasst werden darf!

    Ich hoffe ihr könnt mir damit weiterhelfen!
    Noch einen angenehmen Samtag :)
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Vultrax schrieb:

    Das Problem ist, dass die Log-Datei NUR von der anderen Anwendung aktualisiert wird, wenn man einen Rechtsklick auf diese macht, dadurch feuert logischerweise auch nicht das "Changed"-Ereignis von dem FileSystemWatcher.


    Verstehe ich nicht. Worauf Rechtsklick machen? Auf die Anwendung? Auf die Datei? Spezifiziere mal. Und um welche Anwendung geht es?
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    @Vultrax Habe ich Dich richtig verstanden?
    Du willst auf die andere Anwendung einen Rechts-Mausklick simulieren?
    Mausklick simulieren
    docs.microsoft.com/de-de/dotne…vents?view=netdesktop-5.0
    vbarchiv.net/tipps/tipp_52-mausklick-simulieren.html
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @xChRoNiKx
    Die Log-Datei wird nur dann aktualisiert, wenn man einen Rechtsklick auf diese macht. Die Log-Datei wird von MultiMC (einem Custom-Launcher für Minecraft) oder von Minecraft selbst (kann ich nicht genau sagen, sollte aber auch nicht wichtig sein) erstellt und geschrieben. Die Log-Datei befindet sich unter "MultiMC\instances\[Minecraft Version]\.minecraft\logs\latest.log".

    @RodFromGermany
    Ne, möchte nur die Log-Datei dieser Anwendung in Echtzeit überwachen und auf bestimmte Log-Texte reagieren. Das Problem ist wie nochmal beschrieben, dass sie nicht aktualisiert wird, bis sie mit einem Rechtsklick angeklickt wird. Meine Anwendung muss also irgendwie der anderen Anwendung sagen, dass sie die Datei weiterhin aktualisieren soll.
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Vultrax“ ()

    Vultrax schrieb:

    Meine Anwendung muss also irgendwie der anderen Anwendung sagen, dass sie die Datei weiterhin aktualisieren soll.
    Deine Anwendung muss also der anderen Anwendung einen Mausklick geben, damit diese die LogDatei schreibt, die Du dann lesen möchtest?
    Habe ich das richtig verstanden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Ich glaube ich habe das alles etwas ungünstig erklärt. Die Log-Datei (an sich einfach nur eine Textdatei mit ".log"-Endung) selber (nicht die Anwendung) muss geöffnet oder mit einem Rechtsklick angeklickt werden, damit sie aktualisiert wird. Sobald ich diese mit einem Rechtsklick anklicke oder öffne, wird auch das "Changed"-Ereignis von dem FileSystemWatcher ausgelöst. Die andere Anwendung überprüft also scheinbar, ob auf die Log-Datei in irgendeiner Form zugegriffen wird, bevor die neusten Log-Texte geschrieben werden. Wenn ich zum Beispiel in Notepad++ "View" -> "Monitoring (tail -f)" aktiviere, kann ich sehen, wie die neusten Log-Texte sofort darin auftauchen, es scheint also irgendwie zu funktionieren.
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford
    Nein, das Programm überwacht nicht, wann auf die Logdatei zugegriffen wird und aktualisiert die nur dann - das wäre ein immenser Aufwand, der sich absolut nicht lohnt und auch sowieso keinen Sinn ergibt.

    Der Explorer aktualisiert nicht immer live alle Infos zu den angezeigten Dateien, sondern bspw. bei einem Rechtsklick, daher das beobachtete Verhalten. Beim FSW hast du vermutlich den Filter nicht korrekt eingestellt, sodass das Event nicht beim Bearbeiten feuert.
    @Vultrax Wenn Du die Log-Datei im NotePad++ öffnest, kannst Du dann per Klick auf NotePad sehen, dass die Datei aktualisiert wird?
    ====
    Kann es sein, dass die Log-Datei "permanent" geschrieben wird, ohne dass das Schreiben per Close() und Open() unterbrochen wird?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @nafets
    Das ist mein aktueller Code, vielleicht erkennst du ja, wo ich den Fehler gemacht habe (selbes Ergebnis, wenn ich den ".Filter" entferne):

    VB.NET-Quellcode

    1. Private Sub LogFileWatcher_Changed(sender As Object, e As FileSystemEventArgs)
    2. WriteLine("Something changed!")
    3. End Sub
    4. Sub Main()
    5. Dim LogFileWatcher As New FileSystemWatcher With {.Filter = "latest.log", .NotifyFilter = NotifyFilters.LastWrite Or NotifyFilters.LastAccess}
    6. AddHandler LogFileWatcher.Changed, AddressOf LogFileWatcher_Changed
    7. LogFileWatcher.Path = "F:\MultiMC\instances\1.16.5\.minecraft\logs"
    8. LogFileWatcher.EnableRaisingEvents = True
    9. End Sub

    @RodFromGermany
    Tatsächlich, nach einem Neustart von meinem Computer bekomme ich jetzt auch die "Reload"-Meldung von Notepad++, wenn die Datei darin geöffnet ist. Sie wird scheinbar wirklich permanent geschrieben, allerdings feuert mein FSW-Ereignis immer noch nicht, wenn ich Datei nicht selbst anklicke, (erneut) öffne oder in Notepad++ die "Reload"-Meldung bestätige.
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Vultrax“ ()

    Vultrax schrieb:

    vielleicht erkennst du ja, wo ich den Fehler gemacht habe

    Die Antwort zu deiner Frage habe ich schon geschrieben:

    nafets schrieb:

    Beim FSW hast du vermutlich den Filter nicht korrekt eingestellt, sodass das Event nicht beim Bearbeiten feuert

    Schau dir nochmal deine Filter genau an und probier ein paar Variationen aus, dann wirst du das Problem hoffentlich selbst herausfinden.
    @Vultrax erweitere mal den NotifyFilter um .Size.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @nafets & @RodFromGermany
    Leider kein Erfolg, das Ereignis wird auch weiterhin nicht ausgelöst.
    Ich habe jetzt mal eine kleine Anwendung erstellt, dir mir in einem Loop eine Text-Datei im selben Verzeichnis schreibt und siehe da, mein FileSystemWatcher feuert. Ich versteh's nicht ...
    Die Log-Datei hat sich im selben Zeitraum ebenfalls "geändert" (es müssen Log-Texte geschrieben worden sein) ...

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim LogFileWatcher As New FileSystemWatcher With {.NotifyFilter = NotifyFilters.Attributes Or NotifyFilters.CreationTime Or NotifyFilters.DirectoryName Or NotifyFilters.FileName Or NotifyFilters.LastAccess Or NotifyFilters.LastWrite Or NotifyFilters.Security Or NotifyFilters.Size}
    3. AddHandler LogFileWatcher.Changed, AddressOf LogFileWatcher_Changed
    4. LogFileWatcher.Path = "F:\MultiMC\instances\1.16.5\.minecraft\logs"
    5. LogFileWatcher.EnableRaisingEvents = True
    6. End Sub


    VB.NET-Quellcode

    1. Private Sub LogFileWatcher_Changed(sender As Object, e As FileSystemEventArgs)
    2. WriteLine("Something changed (" & Now.ToString & "): " & e.Name)
    3. End Sub


    VB.NET-Quellcode

    1. Dim randomNumer As New Random
    2. Do
    3. IO.File.WriteAllText("F:\MultiMC\instances\1.16.5\.minecraft\logs\Test.txt", randomNumer.Next(Integer.MinValue, Integer.MaxValue).ToString)
    4. Threading.Thread.Sleep(3000)
    5. Loop




    Wenn ich die "latest.log" mit einem Rechtsklick anklicke:


    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Vultrax“ ()

    Vultrax schrieb:

    IO.File.WriteAllText("F:\MultiMC\instances\1.16.5\.minecraft\logs\Test.txt", randomNumer.Next(Integer.MinValue, Integer.MaxValue).ToString)


    Naja, das ist ja vermutlich kein repräsentatives Beispiel. Eine Log-Datei würde doch niemand immer wieder neu öffnen, wenn er alle 2 Sekunden oder sogar noch öfter rein schreibt. RodFromGermany hat ja schon angemerkt:

    RodFromGermany schrieb:

    Kann es sein, dass die Log-Datei "permanent" geschrieben wird, ohne dass das Schreiben per Close() und Open() unterbrochen wird?
    Würde ich bei einem Log von ausgehen. Als Beispiel also einen FileStream öffnen und immer wieder rein schreiben, ohne diesen zu schließen.
    @Vultrax Lies die Log-Datei in einer Timer-Tick-Prozedur aus mit nem Intervall von 10 Sekunden und gib die Länge der Datei aus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich danke euch für eure Hilfe, habe es jetzt mit einem Loop gelöst, in dem ich mit FileInfo überprüfe, wann auf die Datei zuletzt zugegriffen wurde. Ich werde den Code nachreichen sobald ich kann.

    Habt noch ein schönes restliches Wochenende :)
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford