2017-05-27 2 views
0

Python newbie. Maintenant, j'ai été bloqué autour de cela pendant un moment. Lorsque j'essaie d'écrire des journaux dans un fichier en utilisant la configuration ini, rien n'est capturé dans le fichier. J'ai essayé de déboguer le problème mais je n'ai pas pu trouver d'indice. Écrire des journaux sans utiliser le fichier ini fonctionne parfaitement.configuration de l'enregistreur pour se connecter au fichier

est Ci-dessous le code et le fichier ini

import logging 

from logging.config import fileConfig 

def info(message): 


    fileConfig('logging_config.ini') 
    logger=logging.getLogger("simple logger") 

    logger.warning('Something is not right') 
    logger.warning(message) 

logging_config.ini

[loggers] 
keys=root 

[handlers] 
keys=file_handler 

[logger_root] 
level=WARNING 
handlers=file_handler 

[formatters] 
keys=formatter 

[formatter_formatter] 
format='%(message)s' 

[handler_file_handler] 
class=FileHandler 
level=WARNING 
formatter=formatter 
args=('dummyoutput.log','w') 

J'ai vérifié l'objet de l'enregistreur aussi pour voir si je peux obtenir une idée de ses propriétés. Ci-dessous est l'objet

{'disabled': 0, 
'filters': [], 
'handlers': [<logging.FileHandler object at 0x7ff03358ce90>], 
'level': 30, 
'name': 'root', 
'parent': None, 
'propagate': 1} 

Je ne sais pas si son utile mais j'ai remarqué la propriété disabled a été montré plus tôt TRUE mais maintenant il est 0 chaque fois.

Quelqu'un a-t-il une idée de ce sujet?

Mise à jour: Le problème était dû à plusieurs appels à logging.config.fileConfig() pour le même fichier de configuration. Mais je ne pouvais pas vraiment comprendre pourquoi rien n'était écrit quand cette fonction était appelée pour la dernière fois. Une idée sur ça ??

Répondre

0

Compris ce que l'erreur (stupide) était. En fait, le info(message) était appelé plus d'une fois, tout comme fileConfig() pour le même fichier de configuration que pour la fonction info. D'où le problème. Code modifié comme ci-dessous et cela a fonctionné.

import logging 
from logging.config import fileConfig 

def info(message): 

    logger.warning('Something is not right') 
    logger.warning(message) 

fileConfig('logging_config.ini') 
logger=logging.getLogger("simple.logger") 

Mise à jour: Même si nous ne suivons pas la convention de nommage pour enregistreur par exemple. comme je l'ai donné simple logger au lieu de simple.logger cela fonctionne bien.

2

Il existe une convention de dénomination pour les enregistreurs, et le nom «simple logger» n'est pas valide en raison de l'espace.

Vous devez remplacer l'espace par une période. Nous utilisons généralement des noms de paquets Python pour les enregistreurs.

Voici comment vous pouvez résoudre ce problème:

import logging 

from logging.config import fileConfig 


def info(message): 

    fileConfig('logging_config.ini') 
    logger = logging.getLogger("simple.logger") 

    logger.warning('Something is not right') 
    logger.warning(message) 


if __name__ == "__main__": 
    info("hello") 

Il parfaitement woks.

'Something is not right' 
'hello' 

objets Logger Citation:

Le nom est potentiellement une valeur hiérarchique séparés par des points, comme foo.bar.baz (mais il pourrait aussi être tout simplement foo, par exemple). Les enregistreurs qui sont plus bas dans la liste hiérarchique sont les enfants des enregistreurs plus haut dans la liste. Par exemple, étant donné un enregistreur avec un nom de foo, les enregistreurs avec les noms de foo.bar, foo.bar.baz et foo.bam sont tous les descendants de foo. La hiérarchie du nom du consignateur est analogue à la hiérarchie du package Python et identique à celle-ci si vous organisez vos enregistreurs par module en utilisant la construction recommandée logging.getLogger(__name__). En effet, dans un module, __name__ est le nom du module dans l'espace de noms du package Python.

+0

Oh oui ... vous avez raison. Mais avec ça aussi ça ne marche pas. Aussi, j'ai essayé plus tôt la plupart du temps sans donner de nom de logger 'logger = logging.getLogger()' mais cela n'a pas fonctionné non plus. Aucune idée de ce qui ne va pas là-bas. – qwerty

+1

Pouvez-vous expliquer exactement ce qui ne fonctionne pas (parce que je l'ai testé). Note: vous devez utiliser un chemin complet dans votre INI de configuration. Avez-vous trouvé votre fichier journal? –

+0

Le fichier journal était déjà généré. Le code que vous avez partagé est parfaitement bien. En fait, le problème était que 'info (message)' était appelé plus d'une fois et 'fileConfig()' pour le même fichier de configuration que pour la fonction info * [veuillez vérifier ma réponse ci-dessous pour plus de détails] *. Mais je ne pouvais pas vraiment comprendre pourquoi rien n'était écrit quand cette fonction était appelée pour la dernière fois. Une idée sur ça ?? – qwerty