Laden...

[erledigt] unendliches überwachen eines logfiles

Erstellt von huanson vor 11 Jahren Letzter Beitrag vor 11 Jahren 3.133 Views
Thema geschlossen
H
huanson Themenstarter:in
8 Beiträge seit 2012
vor 11 Jahren
[erledigt] unendliches überwachen eines logfiles

ich brauche so in etwa das "tail" aus linux in c#. das darf eigentlich nicht so schwer sein, wenn man denn weiss wie

        public   void ReadLogfile() {
            using (FileStream reader = new FileStream("C:\\Users\\tim\\AppData\\Local\\PokerStars.EU\\PokerStars.log.0", FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite)) {
                reader.Seek(0, SeekOrigin.End);
                byte[] b = new byte[1024];
                int i = 0;
                for(;;){
                    reader.Read(b, 0, b.Length);
                    if (b[0] != 0) {
                        string s = System.Text.UTF8Encoding.UTF8.GetString(b);
                        Console.WriteLine(s);
                    }
                }
            }
        }


        private void button1_Click(object sender, EventArgs e) {
            Thread t = new Thread(ReadLogfile);
            t.Start();

        }

das logfile wird ständig geschrieben und ich will jede einzelne zeile die geschrieben wird, überwachen. datei neu öffnen kommt eigentlich nicht in frage, da das logfile gut unter dampf steht.

sobald eine neue zeile kommt, passiert folgendes> Fehlermeldung:

[2012/08/19 04:23:28]
MSG_TABLE_SUBSCR_ACTION
Das Programm "[3064] tail.vshost.exe: Verwaltet (v4.0.30319)" wurde mit Code 0 (0x0) beendet.

wie kann ich das ganze realisieren? gehe ich es falsch an?

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo huanson,

grundsätzlich solltest du - mindestens testweise - erstmal alle Exceptions fangen.

Ansonsten wurde das Thema wurde schon einige Male besprochen. Bitte benutze die Forumssuche und poste die besten Treffer hier. Vielen Dank!

herbivore

H
huanson Themenstarter:in
8 Beiträge seit 2012
vor 11 Jahren

erstmal alle Exceptions fangen.

´das hatte ich natürlich versucht

for (; ; ) {
                    try {
                        byte[] b = new byte[1024];
                        reader.Read(b, 0, b.Length);
                        if (b[0] != 0) {
                            string s = System.Text.UTF8Encoding.UTF8.GetString(b);
                            Console.WriteLine(s);
                        }

                    } catch (Exception ec) {
                        Console.WriteLine(ec);

                    }
                }

der catchblock wird nie angesprungen, der thread endet einfach.

über die suche mit dem stichwort "logfile" habe ich bis seite 9 gesucht, jedoch nix gefunden

156 Beiträge seit 2010
vor 11 Jahren

Moin,

über die suche mit dem stichwort "logfile" habe ich bis seite 9 gesucht, jedoch nix gefunden

ist ja auch klar - Du willst das Logfile ja auch auslesen und nicht nur "Logfilen"

oder?, mogel

PS: Treffer erste Seite

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo huanson,

dann kommt die Exception möglicherweise von einer anderen Stelle. Fange alle Exceptions bzw. abonniere alle Events für unbehandelte Exceptions.

Suchen will natürlich gelernt sein. Dass bei (zu) allgemeinen Suchanfragen die Trefferliste (zu) lang wird, kannst du nicht der Forensuche anlasten. Außerdem ist es eine Frage der Erwartungen. Möglicherweise findest du keinen einzigen Treffer mit genau deiner Fehlersituation, aber im Grund brauchst du auch nur Hinweise auf funktionierende Lösungen oder entsprechenden Code, der fehlerfrei funktioniert.

herbivore

H
huanson Themenstarter:in
8 Beiträge seit 2012
vor 11 Jahren
     System.Threading.Thread t = new System.Threading.Thread(ReadLogfile);
            t.Start();
 public void ReadLogfile() {

            string fileName = "C:\\Users\\tim\\AppData\\Local\\PokerStars.EU\\PokerStars.log.0";

            try {
                using (StreamReader reader = new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))) {
                    //start at the end of the file
                    long lastMaxOffset = reader.BaseStream.Length;

                    while (true) {
                        System.Threading.Thread.Sleep(100);

                        //if the file size has not changed, idle
                        if (reader.BaseStream.Length == lastMaxOffset)
                            continue;

                        reader.BaseStream.Seek(lastMaxOffset, SeekOrigin.Begin);

                        string line = "";
                        while ((line = reader.ReadLine()) != null) {
                            //hier machen wir was mit der zeile

                            //update the last max offset
                            lastMaxOffset = reader.BaseStream.Position;
                        }
                    }
                }
            } catch (Exception ex) {
                Console.WriteLine(ex.ToString());

            }
        }

geht nun wunderbar 😃

156 Beiträge seit 2010
vor 11 Jahren

Moin,

evt. wäre ein FileSystemWatcher der auf Änderung der Datei überwacht besser, als alle 100ms zu pollen ob sich die Datei geändert hat. Wenn es unbedingt Pollen sein muss dann ist ggf. 1000ms besser, da in der Zeit eh kaum ein Mensch was lesen kann.

hand, mogel

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo mogel,

die Frage ist, ob der FileSystemWatcher überhaupt Änderungen meldet, solange in eine Datei geschrieben wird, ohne sie zu schließen. Oder ob er andersherum nicht viel zu viele Änderungen meldet, wenn die Datei nach jeder geschriebenen Zeile geschlossen wird. Wenn man davon ausgeht, dass einigermaßen regelmäßig in die Datei geschrieben wird, ist Polling hier ausnahmsweise keine schlechte Option. Und 100ms auch nicht per se zu schnell. Im Gegenteil empfehlen wir oft, das GUI nicht öfter als 10mal pro Sekunde aktualisiert werden sollte, was im Umkehrschluss heißt, dass bis zu 10 mal pro Sekunde normalerweise ok ist. Wie oft man es im Endeffekt macht, hängt von den Umständen und den Vorlieben ab. Davon abgesehen haben wir keine Information darüber, was mit den ausgelesenen Zeilen passiert. Möglicherweise kommen sie gar nicht ins GUI, sondern werden automatisch verarbeitet. 😃

herbivore

888 Beiträge seit 2007
vor 11 Jahren

Zur Info: TraceEye verfügt auch über ein Tail-Log.

Bei Bedarf einfach mal mit dem Reflector reingucken... (TraceEye.Library.Dialogs.FormChildLog.readFile())

1.820 Beiträge seit 2005
vor 11 Jahren

Hallo,

als Kompromiss könnte man in den Einstellungen des Programms bzw. über die Kommandozeile das Polling-Interval vorgeben.

Oder ob er andersherum nicht viel zu viele Änderungen meldet, wenn die Datei nach jeder geschriebenen Zeile geschlossen wird.

Hierzu könnte man die Änderungs-Events zwar vermerken, aber nur im Zeitinterval die Änderungen seit dem letzten Lese-Vorgang ausgeben.

Nobody is perfect. I'm sad, i'm not nobody 🙁

H
huanson Themenstarter:in
8 Beiträge seit 2012
vor 11 Jahren

evt. wäre ein FileSystemWatcher der auf Änderung der Datei überwacht besser, als alle 100ms zu pollen ob sich die Datei geändert hat. Wenn es unbedingt Pollen sein muss dann ist ggf. 1000ms besser, da in der Zeit eh kaum ein Mensch was lesen kann.

hey

ne, 100ms scheitn schon optimal zu sein.
das ganze überwacht das logfile von pokerstars, wenn man dort 24 oder mehr tische gleichzeitig offenhat ist es schon eine riesige datenflut in dem logfile. der filesystemwatcher funktioniert dafür nicht und ist auch viel zu langsam gewesenin meinen tests. 1000ms ist ein zu großes fenster. denke 50ms ist vllt noch n bisschen besser geeignet 😉

anhand der daten die neu reinkommen werden berechnungen gemacht die bis zu 1.5 sekunden dauern, wenn ich nur alle 1000ms pollen würde und in dem zeitraum direkt mal 4x neue einträge gekommen sind, dauert es 6sekunden bis die letzte berechnung fertig ist. das ist zu lang

16.835 Beiträge seit 2008
vor 11 Jahren

Ich mach hier mal zu, da Du offensichtlich hier eine Art Hack baust, der definitiv gegen die Richtlinien und AGB von PokerStars verstößt.
Zudem ist in Deutschland das Manipulieren von Glücksspielen strafbar (und ich kann mir vorstellen, dass das auch für Web- /Software-Angebote gilt).){red}

Sollte dem nicht so sein so melde Dich unter Kontakt zum Team und erklär Dein Vorgehen und Zweck bitte genau.

Thema geschlossen