grep fuer Logfile nachbauen

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
tholle
User
Beiträge: 29
Registriert: Donnerstag 7. Juli 2011, 13:51

Hi Leute,

ich weiss leider nicht mehr weiter und die Frustration ist gross.
Ich lade via http ein Logfile von einem Server und wuerde gern in dem Logfile nach einem bestimmten Wert suchen und mir diesen ausgeben lassen.
Mit Linux-Bordmitteln kein Problem (z.B: mittels grep und/oder awk waere das laengst in trockenen Tuechern ) aber vermeintlich einfache Sachen gestalten sich fuer mich in Python doch relativ schwierig. Sei's drum, ich bin mir sicher, dass sich mit Python auch eine Loesung fuer mein Problem finden laesst.
Ich waelze in meinem Pythonbuch immer und immer die selben Seiten, komme aber nicht auf die richtige Loesung oder ueberlese sie nur immer wieder.

Was soll's, ich schildere mal mein Problem.

Ich hole via http-Request ein logfile ab. Soweit kein Problem.

Code: Alles auswählen

#!/usr/bin/env python3

import requests,string

username = "admin"
password = "xxxxxxxxxx"
miniserver = "http://xxxxxx/log/def.log"
matches = "SDC number of errors: "

r = requests.get(miniserver,
                auth=requests.auth.HTTPBasicAuth(
                username, password
                ))


output = r.content.decode("utf-8")
Der Output sieht wie folgt aus (stark gekuerzt):
2017-01-04 15:55:21.859;User admin logged in from 192.168.xx.xx; Method: encrypted\r\n2017-01-04 18:30:15.181;Save network config: IP: 192.168.xx.xxx, Mask: 255.255.255.0, Gateway: 192.168.xx.xxx, NTP: Undefined\r\n2017-01-04 18:30:15.181;PRG Loxone Config logon from 192.168.xx.xxx\r\n2017-01-04 18:30:24.068;Read config: combine custom changes - file size 136\r\n2017-01-04 18:48:41.796;PRG got restart command\r\n2017-01-04 18:48:42.351;Remove old custom changes\r\n2017-01-04 18:49:01.750;PRG start program\r\n2017-01-04 18:49:02.352;RestoreRemanenceState /sys/rem/rem20.xml and /sys/rem/rem120.xml\r\n2017-01-04 18:49:04.800;weather error authentication exception: user is not activ\r\n2017-01-04 18:49:10.299;PRG start Liveview\r\n2017-01-04 18:49:13.889;User admin logged in from 192.168.xx.xxx; Method: encrypted\r\n2017-01-04 18:50:00.004;SDC number of errors: 2\r\n
Dieses Logfile ist ziemlich gross und ich such in diesem Logfile die Zeile "SDC number of errors: 2", bzw explizit die Zahl in dieser Zeile. Bestenfalls immer das letzte Vorkommen in dem Logfile. Also den aktuellsten Eintrag.

Mich nervt das Problem, weil es sich irgendwie "einfach" anfuehlt, ich es aber nicht mit meinen beschraenkten Wissen loesen kann.
Ich brauche auch nicht zwangslaeufig einen fertigen Code, aber eine Idee, wie ihr an die Sache herangehen wuerdet, waere echt hilfreich.
Ich habe nicht mal einen richtigen Plan, wie man mit Python an so eine Sache heran geht.

Mit den Werkzeugen .find(), .count(), etc habe ich schon rumgespielt, liefern mir aber allesamt nicht die Zahl, die ich brauche, sondern nur Informationen ueber die Zeile die ich suche, nicht aber deren Inhalt. puhhh...

Vielen Dank schon mal fuer Denkanstoesse!

Gruss,
tholle
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst doch einfach nur zeilenweis durchlaufen, und wenn du auf die Zeile triffst (zB mit "if line.startswith("SDC number of")"), dann schaust du dir die Zeile genauer an. Du kannst zB einfach an "errors:" splitten, und den Teil rechts davon in eine Zahl wandeln:

Code: Alles auswählen

for line in content.split("\n"):
    if line.startswith("SDC ..."):
          num = int(line.split("errors:")[1])
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@tholle: erster Schritt, Text in Zeilen teilen (splitlines), zweiter, Zeile mit "SDC number of errors:" suchen, drittens, Zahl ausgeben

Code: Alles auswählen

import requests

username = "admin"
password = "xxxxxxxxxx"
miniserver = "http://xxxxxx/log/def.log"
matches = "SDC number of errors: "

r = requests.get(miniserver,
                auth=requests.auth.HTTPBasicAuth(
                username, password
                ))

output = r.text.splitlines()
for line in output:
    if matches in line:
        print(line)
        errors = int(line.split()[-1])
        print(errors)
Edit: @__deets__: die Zeile startet mit einem Datum.
tholle
User
Beiträge: 29
Registriert: Donnerstag 7. Juli 2011, 13:51

Hi ihr beiden,

vielen Dank fuer's Mitdenken, Aufklaeren und Beispiele liefern.

Klappt soweit super und macht exakt das, was ich wollte.

Viel wichtiger fuer mich ist aber, dass ich zum Einen darin bestaetigt wurde, dass es tatsaechlich nur ein kleines Problem fuer Python ist, und zum Anderen, dass ich mehr Pythonpraxis brauche. ;)

Vielen Dank euch Beiden!
Gruss,
tholle
Antworten