Python: siga un archivo de registro y compare las funciones de cola de bloqueo y no bloqueo

Zeeshan Afridi 21 junio 2023
  1. Descripción general de la función tail() de Python
  2. Seguir un archivo de registro en Python
  3. Funciones de bloqueo vs no bloqueo Tail() en Python
  4. Archivo de registro para los ejemplos anteriores
Python: siga un archivo de registro y compare las funciones de cola de bloqueo y no bloqueo

El tutorial de hoy proporciona una descripción general de la función tail() en Python que conduce a su funcionamiento y demostración de cómo rastrear un archivo de registro.

También compara las funciones de cola de bloqueo y no bloqueo de Python y destaca las diferencias.

Descripción general de la función tail() de Python

En Python, las últimas cinco filas del marco de datos se muestran por defecto cuando se usa la función tail(). Solo hay un parámetro de entrada, que es el número de filas.

Esta opción nos permite mostrar una cantidad específica de filas. Además, la función tail() también acepta un número negativo, como se muestra en el siguiente ejemplo.

En tal situación, se devuelven todas las filas pero no las primeras filas. La distinción principal entre head() y tail() es que, cuando se pasan parámetros vacíos, tanto head() como tail() devuelven cinco filas.

Recuerda que las funciones head() y tail() producen datos ordenados, mientras que sample() produce datos desordenados.

Sintaxis de la función tail():

dataframe.tail(n=5)

Funcionamiento de la función Tail() en Python

Si le pasamos el valor negativo de n a la función tail(), excluirá la primera n (ver el siguiente ejemplo).

Cuando ejecutamos print(df.tail(2)), muestra las dos últimas filas, y cuando ejecutamos print(df.tail(-6)), muestra todas las filas excepto las primeras 6.

Código de ejemplo:

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))

Producción :

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

Seguir un archivo de registro en Python

Hemos creado un archivo de registro llamado std.log en el que hemos almacenado algunos datos, que veremos en el resultado a continuación. Para seguir un archivo de registro, podemos ejecutar la cola desde el módulo sh.

Para realizar un ciclo infinito y mostrar la línea de salida, llamamos a tail() con el nombre del archivo y _iter configurado en True.

Código de ejemplo:

from sh import tail

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

Producción :

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

Funciones de bloqueo vs no bloqueo Tail() en Python

Comencemos con la función tail() sin bloqueo.

Función Tail() sin bloqueo

Cuando una función está bloqueada, potencialmente puede posponer la finalización de actividades posteriores. Además, podemos sufrir el rendimiento general del sistema.

En otras palabras, su programa bloqueará y evitará que se ejecute cualquier otra cosa. Para iniciar el subproceso y conectarse a su flujo de salida, estamos utilizando el módulo subproceso (stdout).

Código de ejemplo:

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)

Producción :

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

Función de bloqueo Tail()

El siguiente código también mostrará nuevas líneas a medida que se agregan, pero puede utilizar el módulo subproceso sin las llamadas adicionales al módulo seleccionar. Se bloquea hasta que el programa final finaliza con el comando f.kill().

Código de ejemplo:

import subprocess

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

Producción :

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'

Archivo de registro para los ejemplos anteriores

El siguiente código es para crear log.txt, que luego se usa en el código de bloqueo y no bloqueo.

Código de ejemplo:

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")

Producción :

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