2010-11-09 3 views
3

J'écris une application serveur qui devrait pouvoir enregistrer à différents niveaux à la fois sur la console et dans un fichier journal.Gestion des journaux avec la journalisation Python

Le problème est que si logging.basicConfig() est défini, il se connectera à la console mais il doit être défini dans le thread principal.

Il peut également être défini avec logging.basicConfig (filename = 'logger.log') pour écrire dans un fichier.

La définition d'un handle pour la consignation de la console (logging.StreamHandler()) ou la consignation des fichiers (logging.FileHandler()) complète l'ensemble d'options logging.baseconfig().

Le problème est que les paramètres ne sont pas indépendants. Ce que je veux dire, c'est que le niveau de log de logging.baseConfig() doit inclure le niveau Handler, ou il ne sera pas connecté. Par conséquent, si je configure le fichier baseConfig pour qu'il se connecte à un fichier et un StreamHandler pour se connecter à la console, le niveau de journalisation du fichier doit être inférieur au niveau de la console. (En outre, l'option basicConfig enregistre tous les autres journaux.)

J'ai essayé de créer deux handles, un pour la console et un pour le fichier journal, ils fonctionnent, mais quel que soit le type de journal spécifié par basicConfig() sera toujours être affiché dupliquer les messages.

Y at-il un moyen de désactiver la sortie de basicConfig()? Ou tout autre moyen d'implémenter ces options?

Merci.

Répondre

4

Vous ne dites pas dans votre question exactement quels niveaux vous voulez sur votre console et la journalisation des fichiers. Cependant, vous n'avez pas besoin d'appeler basicConfig(), car c'est seulement une fonction de commodité. Vous pouvez faire, par exemple, (Code juste tapé, non testé):

import logging 

logger = logging.getLogger(__name__) 
configured = False 

def configure_logging(): 
    global configured 
    if not configured: 
     logger.setLevel(logging.DEBUG) # or whatever 
     console = logging.StreamHandler() 
     file = logging.FileHandler('/path/to/file') 
     #set a level on the handlers if you want; 
     #if you do, they will only output events that are >= that level 
     logger.addHandler(console) 
     logger.addHandler(file) 
     configured = True 

Les événements sont transmis à l'enregistreur d'abord, et si un événement est à traiter (en raison de comparer le niveau de l'enregistreur et l'événement), alors l'événement est transmis à chaque gestionnaire de l'enregistreur et à tous les gestionnaires de ses ancêtres. Si un niveau est défini sur un gestionnaire, l'événement peut être abandonné par ce gestionnaire, sinon il produira l'événement.

Questions connexes