2010-07-20 13 views
35

Estoy tratando de encontrar una buena manera de leer un archivo de registro en tiempo real usando Python. Me gustaría procesar las líneas de un archivo de registro de una en una a medida que se escribe. De alguna manera tengo que seguir tratando de leer el archivo hasta que se cree y luego seguir procesando líneas hasta que termine el proceso. ¿Hay una forma apropiada de hacer esto? Gracias.Leer de un archivo de registro como está siendo escrito usando python

+0

Este también es bueno ... Creo que se ajusta bien a sus criterios y proporciona una clase que podría ampliarse fácilmente. [http://code.activestate.com/recipes/577968-log-watcher-tail-f-log/](http://code.activestate.com/recipes/577968-log-watcher-tail-f-log /) – mogga

Respuesta

20

Usted podría intentar con algo como esto:

import time 

while 1: 
    where = file.tell() 
    line = file.readline() 
    if not line: 
     time.sleep(1) 
     file.seek(where) 
    else: 
     print line, # already has newline 

Ejemplo fue extraído de here.

+0

Esto parece estar funcionando pero no me permitirá crear objetos o escribir en una base de datos al mismo tiempo en mi aplicación django. No veo una razón obvia para esto; ¿hay una solución simple? – Anon

+0

No lo sé. Deberías publicar un código en una pregunta separada para obtener respuestas a esta, supongo. No veo ninguna razón para no actualizar la base de datos si coloca ese código dentro de este ... –

+0

Tengo esto para trabajar, pero tuve que meterme demasiado con la cadena antes de que pudiera escribir en mi base de datos. Gracias. – Anon

-1

Tal vez usted podría hacer una llamada al sistema de

tail -f 

usando os.system()

32

Tome un vistazo a this PDF partir de la página 38, ~ diapositivas I-77 y encontrará todos la información que necesitas Por supuesto, el resto de las diapositivas son increíbles, también, pero los que tratan específicamente de su problema:

import time 
def follow(thefile): 
    thefile.seek(0,2) # Go to the end of the file 
    while True: 
     line = thefile.readline() 
     if not line: 
      time.sleep(0.1) # Sleep briefly 
      continue 
     yield line 
+4

Merece la pena señalar que esto omitirá cualquier contenido que ya esté en el archivo de registro, solo imprimirá las entradas "nuevas" creadas después de que se haya creado este iterador. También ese PDF realmente es una mina de oro;) – blented

3

Como esto es Python y el registro está etiquetado, hay otra posibilidad de hacerlo.

Supongo que esto se basa en un registrador de Python, logging.Handler based.

justo Usted puede crear una clase que obtiene el (llamado) instancia registrador y sobrescribir la función emit para ponerlo en una interfaz gráfica de usuario (si necesita consola sólo tiene que añadir un controlador de consola al controlador de archivo)

Ejemplo:

import logging 

class log_viewer(logging.Handler): 
    """ Class to redistribute python logging data """ 

    # have a class member to store the existing logger 
    logger_instance = logging.getLogger("SomeNameOfYourExistingLogger") 

    def __init__(self, *args, **kwargs): 
     # Initialize the Handler 
     logging.Handler.__init__(self, *args) 

     # optional take format 
     # setFormatter function is derived from logging.Handler 
     for key, value in kwargs.items(): 
      if "{}".format(key) == "format": 
       self.setFormatter(value) 

     # make the logger send data to this class 
     self.logger_instance.addHandler(self) 

    def emit(self, record): 
     """ Overload of logging.Handler method """ 

     record = self.format(record) 

     # --------------------------------------- 
     # Now you can send it to a GUI or similar 
     # "Do work" starts here. 
     # --------------------------------------- 

     # just as an example what e.g. a console 
     # handler would do: 
     print(record) 

actualmente estoy usando un código similar a añadir un TkinterTreectrl.Multilistbox para la visualización de salida de registrador en tiempo de ejecución.

Off-side: El registrador solo obtiene datos tan pronto como se inicializa, por lo que si desea tener todos sus datos disponibles, debe inicializarlos desde el principio. (Sé que esto es lo que se espera, pero creo que vale la pena mencionarlo).

Cuestiones relacionadas