Zetzte Zeile einer Log Datei auslesen.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Straika
User
Beiträge: 2
Registriert: Montag 24. August 2020, 19:50

Hallo,
ich habe mich in letzter Zeit sehr viel mit dem Internet beschäftigt und hoste mittlerweile meinen eigenen Server mit XAMPP. Um zu schauen welcher Leute auf meinem Server unterwegs sind, hatte ich die Idee, dass ich mit einem kleinem Python Programm die letzte Zeile der access.log Datei immer wieder ausgegeben wird, solange die Datei sich verändert.(Also ich sehe jedes mal die Request, die an meinen Computer geschickt wird.)

Code: Alles auswählen

import sys
lines1=0
lines2=0
t=0 #unnötige variable
while(True):
    file1 = open("access.log")
    for line in file1:
        lines1=lines1+1
    file.close()
    file2 = open("access.log")
    
    for line in file2:
        lines2=lines2+1
    file.close()
    if(lines1 == lines2):
        t=t+1 #unnötige Variable
    else:
        fp = open("access.log")
        for i, line in enumerate(fp):
            if (i == lines1+1):
                print(line)
            Elif (i == lines2+1):
                print(line)
            Elif i > 29:
                break
        fp.close()
Leider funktioniert der Code immernoch nicht...
Wenn Sie mir helfen könnten würde ich mich sehr freuen(: :mrgreen: :mrgreen: :mrgreen:
Benutzeravatar
__blackjack__
User
Beiträge: 13927
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Straika: Der Code kommt nicht am Compiler vorbei, weil das kein syntaktisch korrektes Python ist.

Und auch semantisch wird das so nicht funktionieren. Warum genau nimmst Du da nicht einfach ``tail -f`` sondern versuchst Dir das selbst zu programmieren?
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Sirius3
User
Beiträge: 18220
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum hast Du eine Variable, wo Du selbst mit einem Kommentar schreibst, dass sie unnötig ist, weil sie gar nicht benutzt wird?
sys wird importiert, aber dann gar nicht benutzt.
while und if sind keine Funktionen, die Klammern also unnötig und können weg.
`file` ist nicht definiert, da ist also schon der erste Fehler.
`Elif` muß `elif` heißen, und dieser Fehler kommt erst gar nicht am Compiler vobei.
Die Wahrscheinlichkeit, dass sich die Anzahl der Zeilen in `access.log` beim ersten Lesen vom zweiten Lesen unterscheidet, ist sehr gering. Außer dass hier viel Strom verbraten wird, passiert nicht viel.
Warum werden nur Zeilen ausgegeben, wenn access.log weniger als 29 Zeilen hat? Warum werden die Zeilenanzahl in jedem Schleifenlauf einfach auf die vom vorhergehenden Lauf draufaddiert?
Dateien öffnet man immer mit den with-Statement.
Benutzeravatar
pintman
User
Beiträge: 39
Registriert: Freitag 2. Dezember 2005, 20:43
Kontaktdaten:

Straika hat geschrieben: Montag 24. August 2020, 20:08 ich habe mich in letzter Zeit sehr viel mit dem Internet beschäftigt und hoste mittlerweile meinen eigenen Server mit XAMPP.
Das ist keine gute Idee.
XAMPP provides an ideal local development environment, but is not meant for production deployments.
https://www.apachefriends.org/hosting.html
Benutzeravatar
snafu
User
Beiträge: 6832
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn die Datei nicht zu groß ist, würde ich stumpf eine Liste erzeugen und auf das letzte Element zugreifen:

Code: Alles auswählen

with open("access.log") as logfile:
    last_line = list(logfile)[-1]
Alternativ, um den Aufbau der Liste einzusparen:

Code: Alles auswählen

with open("access.log") as logfile:
    for line in logfile:
        pass
print(line)
Dabei wird der Umstand genutzt, dass line auch außerhalb der Schleife gültig ist (zumindest wenn mindestens ein Durchlauf stattgefunden hat).
Straika
User
Beiträge: 2
Registriert: Montag 24. August 2020, 19:50

Danke!
Jetzt klappt es!
nezzcarth
User
Beiträge: 1734
Registriert: Samstag 16. April 2011, 12:47

Straika hat geschrieben: Dienstag 25. August 2020, 16:38 Jetzt klappt es!
"Klappen" würde ich hier mal in Anführungszeichen setzen. Das ist zwar als kleine Übung sicher nett, aber für den produktiven Einsatz aus meiner Sicht ungeeignet. Nimm dafür, wie schon vorgeschlagen, tail. Das ist dafür gedacht, auf jedem Posix System vorhanden und berücksichtigt meist auch Randfälle und Optimierungen, auf die du selbst sehr wahrscheinlich nicht kommen wirst.
Benutzeravatar
__blackjack__
User
Beiträge: 13927
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das `more_itertools`-Modul hat eine praktische `last()`-Funktion für das was snafu gemacht hat. Ist schneller als selbst eine Schleife zu schreiben und verbraucht weniger speicher als alles in eine Liste in den Speicher zu lesen.

Der ”Trick” ist eine `collections.deque` mit einer maximalen Länge von 1, die alle Zeilen bis auf die eine letzte ”verbraucht”, falls man sich das selbst programmieren möchte.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Benutzeravatar
snafu
User
Beiträge: 6832
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

__blackjack__ hat geschrieben: Dienstag 25. August 2020, 17:56 Der ”Trick” ist eine `collections.deque` mit einer maximalen Länge von 1, die alle Zeilen bis auf die eine letzte ”verbraucht”, falls man sich das selbst programmieren möchte.
Das hatte ich auch schon im Sinn, dachte mir aber, dass das Herstellen und unmittelbare Auflösen der Verkettungen die Sache ausbremst. Andererseits gibt es bei einelementigen deques ja gar keine Verkettung und somit entfällt auch der vermutete zusätzliche Aufwand.
nezzcarth hat geschrieben: Dienstag 25. August 2020, 17:23 Nimm dafür, wie schon vorgeschlagen, tail. Das ist dafür gedacht, auf jedem Posix System vorhanden und berücksichtigt meist auch Randfälle und Optimierungen, auf die du selbst sehr wahrscheinlich nicht kommen wirst.
Ob der Unterschied zu deque(logfile, 1) wirklich so groß ist? Zudem ist letzteres portierbar. Man benutzt Python ja gerade, weil man eine Alternative zu den typischen Unix-Tools haben möchte. Auf der anderen Seite der Waage steht halt auch ein gewisser Overhead durch den Aufruf des zusätzlichen Prozesses. Also innerhalb eines Shell-Skripts wäre ich bei dir, aber in einem Python-Skript muss es IMHO nicht zwingend auf tail hinauslaufen.
nezzcarth
User
Beiträge: 1734
Registriert: Samstag 16. April 2011, 12:47

snafu hat geschrieben: Dienstag 25. August 2020, 18:31 Also innerhalb eines Shell-Skripts wäre ich bei dir, aber in einem Python-Skript muss es IMHO nicht zwingend auf tail hinauslaufen.
Ich habe die Frage so verstanden, dass die Funktionalität als Standalone-Skript auf einem Server laufen soll. Ich war jetzt davon ausgegangen, dass das unter Linux läuft, aber XAMPP kann darauf hindeuten, dass es Windows ist (ich hoffe es ja nicht ... :P) und tail nicht unbedingt verfügbar ist. Aus einem Python Skript heraus würde ich auch nicht tail nehmen, sondern es ähnlich wie von euch gezeigt direkt in Python umsetzen.
Sirius3
User
Beiträge: 18220
Registriert: Sonntag 21. Oktober 2012, 17:20

Das X sagt schon, dass es sich um ein *niX handelt, sonst wäre es ein WAMPP.

In der ursprünglichen Frage ging es auch gar nicht wirklich um sie letzte Zeile, sondern um neu hinzu kommende Zeilen. Und das machte tail während ein Python-Programm da deutlich aufwändiger ist als zwei Zeilen.
Benutzeravatar
sparrow
User
Beiträge: 4506
Registriert: Freitag 17. April 2009, 10:28

@Sirius3: Inzwischen heißt das Komplettpaket für alle Plattformen gleich. Kein WAMPP, MAMPP oder LAMPP mehr. Es könnte also wirklich ein Windows sein. Wenn Straika erst vor ein paar Monaten damit angefangen hat, sich mit der Erstellung von Internetseiten und deren technische Grundlage zu beschäftigen, wird er nur ein XAMPP gefunden haben, dass man für verschiedene Betriebssysteme herunterladen kann.
nezzcarth
User
Beiträge: 1734
Registriert: Samstag 16. April 2011, 12:47

Sirius3 hat geschrieben: Mittwoch 26. August 2020, 07:31 Das X sagt schon, dass es sich um ein *niX handelt, sonst wäre es ein WAMPP.
Nein. Wie sparrow schon meinte, ist XAMPP eine schlüsselfertiger Webstack, der, soweit ich weiß, vor allem und insbesondere bei Entwicklern, die unter Windows arbeiten verbreitet ist. Daher die Anmerkung
Antworten