Registro usando múltiples procesos en un archivo en Python

Greg Brown

Estoy intentando configurar el registro entre varios procesos usando QueueHandler. Veo el mismo registro en el archivo de registro impreso varias veces. Usando esto como plantilla ( https://docs.python.org/3/howto/logging-cookbook.html#logging-to-a-single-file-from-multiple-processes )

EDITAR

archivo de procesamiento múltiple:

import logging
from logging.handlers   import RotatingFileHandler, QueueHandler
from multiprocessing import Process
from queue import Empty

class MultiProcessQueueLoggingListner(Process):
    def __init__(self, name, queue):
        super().__init__()
        self.name = name
        self.queue = queue
        self.logger = logging.getLogger(name)
        self.file_handler = RotatingFileHandler(name, maxBytes=536870912, backupCount=2)
        self.formatter = logging.Formatter('%(asctime)s %(processName)-10s %(name)s %(levelname)-8s %(message)s')
        self.file_handler.setFormatter(self.formatter)
        self.logger.addHandler(self.file_handler)

    def run(self):
        while True:
            try:
                record = self.queue.get()
                if record is None:
                    break
                self.logger.handle(record)
            except Exception:
                import sys, traceback
                print('Whoops! Problem:', file=sys.stderr)
                traceback.print_exc(file=sys.stderr)


class MulitProcessQueueLogger(object):
def __init__(self, name, queue):
    self.name = name
    self.queue = queue
    self.queue_handler = QueueHandler(queue)
    self.logger = logging.getLogger(name)
    self.logger.addHandler(self.queue_handler)
    self.logger.setLevel(logging.DEBUG)

archivo de prueba:

import multi_process_logging
import multiprocessing
from time import sleep


def worker(po):
    name = multiprocessing.current_process().name
    po = multi_process_logging.MulitProcessQueueLogger('test.log', q)
    print("In worker")
    for i in range(10):
        po.logger.info(f"Logging from {name} line {i}")
    po.queue.put(None)

def main():
    q = multiprocessing.Queue()
    lp = multi_process_logging.MultiProcessQueueLoggingListner('test.log', q)
    lp.start()
    p = multiprocessing.Process(target=worker, args=(q,))
    p.start()
    p.join()
    lp.join()



if __name__ == '__main__':
    main()

El problema que veo es que el archivo test.log contiene varias líneas para la misma entrada. El programa se detiene ahora y no se ejecuta indefinidamente, pero sigue viendo varias líneas

    cat test.log | grep 'line 0'
2018-09-26 16:32:40,117 Process-2  test.log INFO     Logging from Process-2 line 0
2018-09-26 16:32:40,117 Process-2  test.log INFO     Logging from Process-2 line 0
2018-09-26 16:32:40,117 Process-2  test.log INFO     Logging from Process-2 line 0
2018-09-26 16:32:40,117 Process-2  test.log INFO     Logging from Process-2 line 0
2018-09-26 16:32:50,318 Process-2  test.log INFO     Logging from Process-2 line 0
2018-09-26 16:32:50,318 Process-2  test.log INFO     Logging from Process-2 line 0
2018-09-26 16:32:50,318 Process-2  test.log INFO     Logging from Process-2 line 0
2018-09-26 16:32:50,318 Process-2  test.log INFO     Logging from Process-2 line 0

Eliminé test.log antes de la ejecución para descartar el agregado a un archivo de registro existente, pero aún veo varios registros.

Gracias

Vinay Sajip

Su problema se debe al hecho de que está comprobando que Nonea salga del bucle, pero eso nunca llegará porque a QueueHandlersiempre escribe LogRecorda en una cola, nunca None. Si desea escribir Noneen la cola, debe hacerlo directamente en lugar de hacerlo po.logger.info(None). Por ejemplo, almacene la cola como un atributo llamado queuede su MulitProcessQueueLoggerinstancia y luego hágalo po.queue.put(None)en worker().

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Registro de múltiples aplicaciones / procesos en un solo archivo de registro

posibilidad de bloqueo para múltiples procesos escribiendo su registro en un archivo al mismo tiempo

Python escribiendo en un archivo desde múltiples procesos de Python separados, ¿tengo que bloquear el archivo?

¿Cómo escribir en un archivo, usando el módulo de registro de Python?

Escritura paralela en un archivo desde múltiples procesos utilizando echo

Crear múltiples columnas en un archivo csv y separar los datos individuales en múltiples columnas usando Python

Python 3: ¿Cómo escribir en el mismo archivo desde múltiples procesos sin estropearlo?

Python: escribir un registro en un archivo

Poner en cola un tf.RandomShuffleQueue de múltiples procesos usando multiprocesamiento

Poner en cola un tf.RandomShuffleQueue de múltiples procesos usando multiprocesamiento

Poner en cola un tf.RandomShuffleQueue de múltiples procesos usando multiprocesamiento

contenido de múltiples archivos txt en un solo archivo de Excel usando python

Raspando diferentes variables de múltiples URL en un solo archivo CSV usando Python

contenido de múltiples archivos txt en un solo archivo de Excel usando python

Usando ScatterV para dividir una matriz en múltiples procesos

¿Por qué mi archivo no está dañado mientras escribo en él desde múltiples procesos en Python?

Linux: grep para múltiples cadenas en un archivo de registro en una fecha determinada

¿Cómo ejecutar múltiples procesos en ventanas separadas simultáneamente desde un solo archivo PS1?

Eliminar un registro en un archivo CSV usando C #

trazar el gráfico de múltiples procesos en Python

Cómo usar un archivo de registro con Serilog en múltiples clases

¿Cómo usar el flujo de datos entrantes en un socket para múltiples procesos paralelos en Python?

Monolog: registre diferentes canales y múltiples controladores en un archivo de registro agrupado + archivos de registro dedicados

Cómo construir un solo archivo .exe con múltiples archivos en python usando cx_freeze

Cómo compilar múltiples archivos de subprocesos de Python en un solo archivo .exe usando pyinstaller

Cómo analizar datos de múltiples filas y cadenas de múltiples líneas y extraer datos en un archivo JSON usando Python

Insertar múltiples líneas almacenadas en una variable usando sed en un archivo

Trazar múltiples archivos en un solo archivo ps en diferentes páginas usando gnuplot

Test-Path en Powershell usando datos de múltiples columnas en un archivo CSV

TOP Lista

CalienteEtiquetas

Archivo