Estoy tratando de encontrar una manera agradable de leer un archivo de registro en tiempo real usando python. Me gustaría proceso de líneas de un archivo de registro de una en una, como está escrito. De alguna manera tengo que seguir tratando de leer el archivo hasta que se creó y, a continuación, seguir líneas de proceso hasta que finalice el proceso. Es allí una manera adecuada para hacer esto? Gracias.

InformationsquelleAutor Anon | 2010-07-20

4 Comentarios

  1. 26

    Podrías probar 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 aquí.

    • Esto parece estar funcionando, pero no me permite crear objetos o escribir en una base de datos al mismo tiempo en mi aplicación de django. No veo una razón obvia para esto hay una solución sencilla?
    • No sé. Usted debe publicar el código en una cuestión separada para obtener respuestas a este, supongo. No veo ninguna razón para no obtener de la base de datos se actualiza si el lugar que el código dentro de este…
    • Tiene esto para el trabajo, pero yo tenía que meterse con la cadena de mucho antes de que yo pudiera llegar a escribir a mi base de datos. Gracias.
    • file parece ser indefinido en este contexto, para su información.
  2. 43

    Echa un vistazo a este PDF a partir de la página 38, ~diapositiva de la I-77 y encontrarás toda la información que necesita. Por supuesto, el resto de las diapositivas son increíbles, también, pero los que tratan específicamente con el 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
    • Vale la pena señalar que esto omitirá cualquier contenido ya en el archivo de registro, sólo la impresión de la «nueva» entradas creadas después de este iterador fue creado. También que el PDF es realmente una mina de oro 😉
    • Qué hacer, si puedo ver la rotación de archivos de registro? stackoverflow.com/questions/44407834/…
    • por qué crees que esto no funciona en Python2?
  3. 5

    Como es Python y el registro de etiquetado, no hay otra posibilidad para ello.

    Supongo que esto está basado en Python registrador, la tala de árboles.Controlador de base.

    Sólo se puede crear una clase que se obtiene de la (nombre) registrador instancia y sobrescribir el emit función de ponerlo en una interfaz gráfica de usuario (si usted necesita la consola acaba de agregar una consola controlador para el 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 para agregar un TkinterTreectrl.Multilistbox para ver registrador de salida en tiempo de ejecución.

    Off-Side: El registrador sólo obtiene los datos tan pronto como se inicia, por lo que si quieres tener todos los datos disponibles, usted necesita para inicializar al principio. (Sé que esto es lo que se espera, pero creo que vale la pena ser mencionado.)

Dejar respuesta

Please enter your comment!
Please enter your name here