La journalisation à l'aide elasticsearch-py
Je voudrais connecter mon python
script qui utilise elasticsearch-py
. En particulier, je veux avoir trois journaux:
- Journal général: journal
INFO
et au-dessus des deux à lastdout
et dans un fichier. - ES de journal: seulement ES lié uniquement les messages dans un fichier.
- ES du journal de suivi: Extended ES d'enregistrement (curl requêtes et leur production par exemple) vers un fichier.
Voici ce que j'ai à ce jour:
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)
Mon problème est que INFO
messages de es_logger
sont également d'afficher sur le terminal. Comme une question de fait, le journal des messages sont enregistrés dans les fichiers!
Si je dissolvant de la partie relative à logger
, puis l'ES journalisation fonctionne très bien, c'est à dire uniquement enregistrées dans le fichier correspondant. Mais ensuite, je n'ai pas l'autre partie.... Qu'est-ce que je fais mal avec la dernière partie de l'paramètres?
Modifier
Possible astuce: Dans les sources de elasticsearch-py
il y a un bûcheron nommé logger
. Se pourrait-il qu'il est en conflit avec le mien? J'ai essayé de changer le nom de logger
à main_logger
dans les lignes ci-dessus, mais il n'a pas aidé.
Possible astuce 2: Si je remplace le logger = logging.getLogger('mainLog')
avec logger = logging.getLogger()
, puis le format de la sortie de la console de es_logger
change et devient identique à celle définie dans le code.
Vous devez vous connecter pour publier un commentaire.
Je pense que vous êtes d'être frappé par le peu déroutant enregistreur de hiérarchie de propagation. Tout ce qui est enregistré dans "elasticsearch.trace" qui passe le niveau de journalisation de que enregistreur, se propagent d'abord à la "elasticsearch" enregistreur, puis à la racine ("") enregistreur. Notez qu'une fois que le message passe le niveau de journalisation de la "elasticsearch.trace" logger, les niveaux des parents ("elasticsearch" et de la racine) ne sont pas vérifiées, mais tous les messages seront envoyés aux maîtres-chiens. (Les gestionnaires eux-mêmes niveaux de journal, qui ne s'applique.)
Prenons l'exemple suivant illustre le problème, et une solution possible:
De sortie:
Vous voyez que "msg1" est connecté à la fois par les "foo" logger, et sa mère, la racine de l'enregistreur (en tant que "DEBUG:foo:msg1"). Puis, quand la propagation est éteint
ll.propagate = False
avant "msg2", la racine de l'enregistreur n'est plus l'enregistre. Maintenant, si vous commentez la première ligne (logging.info("DUMMY...")
, puis le changement de comportement de sorte que la racine de l'enregistreur de ligne ne sera pas affiché. C'est parce que lelogging
module de haut niveau des fonctionsinfo()
,debug()
etc. configurer la racine de l'enregistreur avec un gestionnaire lorsque aucun gestionnaire n'a pas encore été défini. C'est aussi pourquoi vous voyez comportement différent dans votre exemple, lorsque vous modifiez la racine de gestionnaire en faisantlogger = logging.getLogger()
.Je ne vois pas dans votre code qui vous permettrait de faire quoi que ce soit à la racine de l'enregistreur, mais comme vous le voyez, un chien errant
logging.info()
ou dans votre code ou le code de la bibliothèque serait la cause d'un gestionnaire doit être ajouté.Donc, pour répondre à votre question, je voudrais définir
logger.propagate = False
pour les bûcherons où il fait sens pour vous et où vous le voulez de propagation, vérifiez que le niveau de journal des gestionnaires eux-mêmes sont comme vous le souhaitez.Ici est une tentative: