Registro de uso de elasticsearch-py

Me gustaría iniciar mi python secuencia de comandos que utiliza elasticsearch-py. En particular, quiero tener tres registros:

  1. General de registro: registro de INFO y por encima de ambas a la stdout y a un archivo.
  2. ES de registro: sólo ES relativa sólo de los mensajes a un archivo.
  3. ES de registro de seguimiento de: Extendido ES el registro (curl de consultas y su salida por ejemplo) sólo a un archivo.

Aquí es lo que tengo hasta ahora:

import logging
import logging.handlers

es_logger = logging.getLogger('elasticsearch')
es_logger.setLevel(logging.INFO)
es_logger_handler=logging.handlers.RotatingFileHandler('top-camps-base.log',
                                                          maxBytes=0.5*10**9,
                                                          backupCount=3)
es_logger.addHandler(es_logger_handler)

es_tracer = logging.getLogger('elasticsearch.trace')
es_tracer.setLevel(logging.DEBUG)
es_tracer_handler=logging.handlers.RotatingFileHandler('top-camps-full.log',
                                                       maxBytes=0.5*10**9,
                                                       backupCount=3)
es_tracer.addHandler(es_tracer_handler)

logger = logging.getLogger('mainLog')
logger.setLevel(logging.DEBUG)
# create file handler
fileHandler = logging.handlers.RotatingFileHandler('top-camps.log',
                                                   maxBytes=10**6,
                                                   backupCount=3)
fileHandler.setLevel(logging.INFO)
# create console handler
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.INFO)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
consoleHandler.setFormatter(formatter)
fileHandler.setFormatter(formatter)
# add the handlers to logger
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler)

Mi problema es que INFO mensajes de es_logger se muestran también en la terminal. Como cuestión de hecho, los mensajes de registro se guardan en los archivos de derecho!

Si me remover la parte relativa a la logger, entonces el ES el registro funciona bien, es decir, sólo se guardan en los archivos correspondientes. Pero entonces yo no tengo la otra parte…. ¿Qué es lo que estoy haciendo mal con la última parte de la configuración?


Editar

Posible sugerencia: En las fuentes de elasticsearch-py hay un registrador nombrado logger. Podría ser que entre en conflicto con el mío? Traté de cambiar el nombre de logger a main_logger en las líneas anteriores, pero no ayuda.

Posible sugerencia 2: Si reemplazar logger = logging.getLogger('mainLog') con logger = logging.getLogger(), a continuación, el formato de la salida a la consola de es_logger los cambios y se vuelve idéntica a la definida en el fragmento.

InformationsquelleAutor Dror | 2014-08-22

1 Kommentar

  1. 8

    Creo que están siendo golpeados por el, algo confuso, registrador de la jerarquía de propagación. Todo lo que se registra en «elasticsearch.trace» que pasa el nivel de registro de que registrador, se propaga primero a la «elasticsearch» registrador y, a continuación, a la raíz («») registrador. Tenga en cuenta que una vez que el mensaje pasa el loglevel de la «elasticsearch.trace» logger, la loglevels de los padres («elasticsearch» y de la raíz) no se comprueban, pero todos los mensajes serán enviados a los controladores. (Los controladores de sí mismos tienen los niveles de registro que se aplican.)

    Considere el siguiente ejemplo que ilustra el problema y una posible solución:

    import logging
    
    # The following line will basicConfig() the root handler
    logging.info('DUMMY - NOT SEEN')
    ll = logging.getLogger('foo')
    ll.setLevel('DEBUG')
    ll.addHandler(logging.StreamHandler())
    ll.debug('msg1')
    ll.propagate = False
    ll.debug('msg2')

    De salida:

    msg1
    DEBUG:foo:msg1
    msg2

    Vea que «msg1» se registra tanto por la «foo» registrador, y de su padre, la raíz del registrador (como «DEBUG:foo:msg1»). Entonces, cuando la propagación se apaga ll.propagate = False antes «msg2», la raíz del registrador no la registra. Ahora, si se va a comentar la primera línea (logging.info("DUMMY..."), el comportamiento sería el cambio, de modo que la raíz del registrador de línea no se muestran. Esto es debido a que el logging módulo de nivel superior funciones info(), debug() etc. configurar la raíz logger con un controlador cuando no hay ningún controlador aún no ha sido definida. También es por eso que usted ve un comportamiento diferente en su ejemplo, cuando se modifica la raíz controlador haciendo logger = logging.getLogger().

    Yo no puedo ver en el código que se estaría haciendo nada a la raíz del registrador, pero como se puede ver, un perro callejero logging.info(), o en su código o el código de la biblioteca podría causar un controlador de ser añadido.

    Así que, para responder a su pregunta, yo le pondría logger.propagate = False a los madereros donde tenga sentido para usted y donde usted quiere propagación, compruebe que el nivel de registro de los handlers son como tú quieres.

    Aquí es un intento de:

    es_logger = logging.getLogger('elasticsearch')
    es_logger.propagate = False
    es_logger.setLevel(logging.INFO)
    es_logger_handler=logging.handlers.RotatingFileHandler('top-camps-base.log',
                                                          maxBytes=0.5*10**9,
                                                          backupCount=3)
    es_logger.addHandler(es_logger_handler)
    
    es_tracer = logging.getLogger('elasticsearch.trace')
    es_tracer.propagate = False
    es_tracer.setLevel(logging.DEBUG)
    es_tracer_handler=logging.handlers.RotatingFileHandler('top-camps-full.log',
                                                       maxBytes=0.5*10**9,
                                                       backupCount=3)
    es_tracer.addHandler(es_tracer_handler)
    
    logger = logging.getLogger('mainLog')
    logger.propagate = False
    logger.setLevel(logging.DEBUG)
    # create file handler
    fileHandler = logging.handlers.RotatingFileHandler('top-camps.log',
                                                   maxBytes=10**6,
                                                   backupCount=3)
    fileHandler.setLevel(logging.INFO)
    # create console handler
    consoleHandler = logging.StreamHandler()
    consoleHandler.setLevel(logging.INFO)
    # create formatter and add it to the handlers
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    consoleHandler.setFormatter(formatter)
    fileHandler.setFormatter(formatter)
    # add the handlers to logger
    logger.addHandler(consoleHandler)
    logger.addHandler(fileHandler)

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea