Python - Verfolgen Sie eine Protokolldatei und vergleichen Sie blockierende und nicht blockierende Tail-Funktionen

Zeeshan Afridi 21 Juni 2023
  1. Überblick über die Python-Funktion tail()
  2. Verfolgen Sie eine Protokolldatei in Python
  3. Blockierende vs. nicht blockierende Tail()-Funktionen in Python
  4. Protokolldatei für die obigen Beispiele
Python - Verfolgen Sie eine Protokolldatei und vergleichen Sie blockierende und nicht blockierende Tail-Funktionen

Das heutige Tutorial bietet einen Überblick über die Funktion tail() in Python, die zu ihrer Funktionsweise führt, und zeigt, wie man eine Protokolldatei tailt.

Es vergleicht auch die blockierenden und nicht blockierenden Schwanzfunktionen von Python und hebt die Unterschiede hervor.

Überblick über die Python-Funktion tail()

In Python werden die letzten fünf Zeilen des Datenrahmens standardmäßig angezeigt, wenn die Funktion tail() verwendet wird. Es gibt nur einen Eingabeparameter, nämlich die Anzahl der Zeilen.

Mit dieser Option können wir eine bestimmte Anzahl von Zeilen anzeigen. Darüber hinaus akzeptiert die Funktion tail() auch eine negative Zahl, wie im folgenden Beispiel gezeigt.

In einer solchen Situation werden alle Zeilen zurückgegeben, aber nicht die ersten Zeilen. Der Hauptunterschied zwischen head() und tail() besteht darin, dass head() und tail() beide fünf Zeilen zurückgeben, wenn leere Parameter übergeben werden.

Denken Sie daran, dass die Funktionen head() und tail() geordnete Daten erzeugen, während sample() ungeordnete Daten erzeugt.

Syntax der Funktion tail():

dataframe.tail(n=5)

Funktionsweise der Tail()-Funktion in Python

Wenn wir den negativen Wert von n an die Funktion tail() übergeben, wird das erste n ausgeschlossen (siehe folgendes Beispiel).

Wenn wir print(df.tail(2)) ausführen, zeigt es die letzten beiden Zeilen an, und wenn wir print(df.tail(-6)) ausführen, zeigt es alle Zeilen außer den ersten 6 an.

Beispielcode:

import pandas as pd

df = pd.DataFrame(
    {
        "Colours": [
            "Purple",
            "White",
            "Black",
            "Brown",
            "Pink",
            "Orange",
            "Blue",
            "Red",
            "Yellow",
        ]
    }
)
print("Complete Data Frame:")
print(df)

print("When we pass the value of `n`:")
print(df.tail(2))

print("\nWhen we pass the -ve value of `n`:")
print(df.tail(-6))

Ausgang:

Complete Data Frame:
   Colours
0  Purple
1   White
2   Black
3   Brown
4    Pink
5  Orange
6    Blue
7     Red
8  Yellow

When we pass the value of `n`:
   Colours
7     Red
8  Yellow

When we pass the -ve value of `n`:
   Colours
6    Blue
7     Red
8  Yellow

Verfolgen Sie eine Protokolldatei in Python

Wir haben eine Protokolldatei mit dem Namen std.log erstellt, in der wir einige Daten gespeichert haben, die wir in der Ausgabe unten sehen werden. Um eine Protokolldatei zu taillen, können wir das tail vom sh-Modul aus ausführen.

Um eine Endlosschleife auszuführen und die Ausgabezeile anzuzeigen, rufen wir tail() auf, wobei der Dateiname und _iter auf True gesetzt sind.

Beispielcode:

from sh import tail

for line in tail("-f", "std.log", _iter=True):
    print(line)

Ausgang:

2022-08-25 21:44:10,045 This is just a reminder
2022-08-25 21:44:10,046 Meeting is at 2 pm
2022-08-25 21:44:10,046 After the lunch break

Blockierende vs. nicht blockierende Tail()-Funktionen in Python

Beginnen wir mit der nicht blockierenden Funktion tail().

Nicht blockierende Tail()-Funktion

Wenn eine Funktion blockiert ist, kann sie möglicherweise den Abschluss nachfolgender Aktivitäten verzögern. Darüber hinaus können wir die Gesamtleistung des Systems beeinträchtigen.

Mit anderen Worten, Ihr Programm blockiert und verhindert, dass alles andere ausgeführt wird. Um den subprocess zu starten und sich mit seinem Ausgabestrom zu verbinden, verwenden wir das Modul subprocess (stdout).

Beispielcode:

import subprocess
import select
import time

f = subprocess.Popen(
    ["tail", "-F", "log.txt"], stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
p = select.poll()
p.register(f.stdout)

while True:
    if p.poll(1):
        print(f.stdout.readline())
    time.sleep(1)

Ausgang:

b'2022-08-25 21:44:10,045 This is just a reminder\n'

Sperrung der Tail()-Funktion

Der folgende Code zeigt auch neue Zeilen an, wenn sie hinzugefügt werden, aber Sie können das subprocess-Modul ohne die zusätzlichen select-Modulaufrufe verwenden. Es blockiert, bis das Tail-Programm mit dem Befehl f.kill() beendet wird.

Beispielcode:

import subprocess

f = subprocess.Popen(
    ["tail", "-F", "log.txt"], stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
while True:
    line = f.stdout.readline()
    print(line)

Ausgang:

b'2022-08-25 21:44:10,045 This is just a reminder\\n'
b'2022-08-25 21:44:10,046 Meeting is at 2 pm\\n'

Protokolldatei für die obigen Beispiele

Der folgende Code dient zum Erstellen von log.txt, die dann im blockierenden und nicht blockierenden Code verwendet wird.

Beispielcode:

import logging
logging.basicConfig(filename="log.txt", level=logging.DEBUG,
                    format="%(asctime)s %(message)s")
logging.debug("This is just a reminder")
logging.info("Meeting is at 2 pm")
logging.info("After the lunch break")

Ausgang:

2022-08-25 21:44:10,045 This is just a reminder
2022-08-25 21:44:10,046 Meeting is at 2 pm
2022-08-25 21:44:10,046 After the lunch break
Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn