IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

utiliser le package logging et le définir dans un module personalisé


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    chomeur
    Inscrit en
    Mai 2022
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Mai 2022
    Messages : 88
    Par défaut utiliser le package logging et le définir dans un module personalisé
    Bonjour
    j'ai un programme main.py où j'utilise le package logging:

    dans le main.py, j'ai cet extrait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    logger = logging.getLogger(__name__)
    logging.basicConfig(level=logging.DEBUG,
                         format='%(name)s--%(levelname)s--%(message)s')
     
     
    formatter = logging.Formatter('%(asctime)s--%(name)s--%(levelname)s--%(message)s')
    file_handler = logging.FileHandler(f'{log_folder_path}/log.log', mode='w')
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    mon main.py marche bien, mais il est deguelasse.
    j'ai défini des fonctions et j'aimerai mettre ces fonctions dans un module, puis demander au main.py d'importer ce module pour ensuite utiliser les fonctions
    je créé alors un dossier utils et je mets le fichier helpers.py où je définis toutes les fonctions utilisées par main.py.

    dans ce helper.py, j'aimerai aussi avoir un logger pour logger des infos.
    je crée donc une fonction qui me crée le logger.
    dans le main.py, je n'ai plus le code affiché au début, j'ai importé helpers.py donc j'appelle la fonction qui me crée le logger.

    puis je me dis que les fonctions que j'ai créées dans helpers devraient aussi appeler la fonction qui créé le helper pour avoir de slogs quand me fonctions s'executent.

    est-ce une bonne pratique de faire ca?
    ca semble un peu casse guele à programmer non?

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour
    Citation Envoyé par marietar Voir le message
    les fonctions que j'ai créées dans helpers devraient aussi appeler la fonction qui créé le helper pour avoir de slogs quand me fonctions s'executent.
    Désolé je ne comprends pas le sens de la question, mais ce que tu sembles décrire en structure de fichiers est justement le premier exemple donné dans la doc python ... Tu désires réinventer la roue ou tu ne fais pas confiance à la doc ?

  3. #3
    Membre confirmé
    Homme Profil pro
    chomeur
    Inscrit en
    Mai 2022
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Mai 2022
    Messages : 88
    Par défaut
    merci, j'ai essayé de siuvr ela doc mais j'ai toujour sun souci:
    j'ai un dossier essai_logging.
    dans ce dossier, j'ai le dossier 'app'

    Dans ce dossier app, j'ia le script main.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import logging
    from utils.helpers import function1
    from utils.config_logger import init_logger
    logger0 = logging.getLogger(__name__)
    logger1 = init_logger(logger0)
    function1()
    logger1.info("etape2")
    dans le dossier app, j'ai ensuite un dossier utils avec 2 scripts où j'ai les fonctions appelées par main.py:
    pour init_logger.py :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import logging
     
    def init_logger(logger):
        logger.setLevel(logging.INFO)
        logging.basicConfig(level=logging.DEBUG,
                            format='%(name)s--%(levelname)s--%(message)s')
     
        formatter = logging.Formatter('%(asctime)s--%(name)s--%(levelname)s--%(message)s')
        file_handler = logging.FileHandler(f'app/log/log.log', mode='w')
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)
     
        return logger
    pour helpers.py:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import logging
    from utils.config_logger import init_logger
     
    loggerZZ = logging.getLogger(__name__)
    logger2 = init_logger(loggerZZ)
     
    def function1():
        logger2.warning("AZETRYUUU")
        pass
    quand je lance main.py:
    dans la console tout s'affiche bien:
    utils.helpers--WARNING--AZETRYUUU
    __main__--INFO--etape2
    mais dans le fihcier log, j'ia ca:
    2024-07-16 21:48:32,022--__main__--INFO--etape2
    -AZETRYUUU
    pourquoi le ifchier log s'affiche mal?

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    1er point

    pourquoi toutes ces variables loggerX ... loggerY boujour la complexité sans raison

    La simplicité, c'est de créer par exemple une simple fonction qui prend en paramètre le nom du module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def init_logger(name):
       logger = logging.getLogger(name)
       ...
       return logger
     
    # dans chaque fichier (même le main),on a qu'un seul appel :
    logger = init_logger(__name__)
    # donc, par simplicité, on va utiliser partout le même nom de variable


    pourquoi le fichier log s'affiche mal?
    Car tu as, dans ton code, plusieurs "file_handler" ! Donc tu vas écrire en même temps dans un même fichier ouvert plusieurs fois

    Une façon de n'avoir qu'un seul fichier log ouvert est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def init_logger(name):
        if name != "__main__":
            name = f"__main__.{name}"    # les modules ont un parent
        logger = logging.getLogger(name)
        logger.setLevel(logging.DEBUG)
        logging.basicConfig(level=logging.DEBUG, format='%(name)s--%(levelname)s--%(message)s')
     
        if name != "__main__":    # les modules n'ont pas leur propre log d'ouvert, ils utilisent le parent (__main__)
            return logger    
        formatter = logging.Formatter('%(asctime)s -- %(name)s -- %(levelname)s -- %(message)s')
        file_handler = logging.FileHandler('app/log/log.log', mode='w')
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)
     
        return logger

  5. #5
    Membre confirmé
    Homme Profil pro
    chomeur
    Inscrit en
    Mai 2022
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Mai 2022
    Messages : 88
    Par défaut
    je ne vois pas à quel moment j'ai plusieurs file handler.
    le file handler est déifni dans ma fonction non?

    et pourquoi tu testes deux fois if name != "__main__":

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Citation Envoyé par marietar Voir le message
    je ne vois pas à quel moment j'ai plusieurs file handler.
    si tu ne vois pas que tu appelles logger.addHandler() à chaque fois dans ta fonction "init_logger", donc un appel dans chaque module, je ne peux rien pour toi.
    Citation Envoyé par marietar Voir le message
    le file handler est déifni dans ma fonction non?
    et pourquoi tu testes deux fois if name != "__main__":
    C'est ton code
    J'ai mis des commentaires pour ces 2 "if", comme dit précédemmment, tu cherches à faire un truc sorti de ton imagination au lieu de faire ce qui est préconisé dans la doc ! j'ai donc dû faire ces pirouettes pour palier.


    Citation Envoyé par marietar
    merci, j'ai essayé de siuvr ela doc
    ps: merci pour le francais bien compréhensible

    Et non , tu n'as en rien suivi la doc ! ton exemple, trés très très proche de la doc, peut s'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import logging
    from utils.helpers import function1
     
    logger = logging.getLogger("APP")
    logger.setLevel(logging.DEBUG)
    logging.basicConfig(format='%(name)s -> %(levelname)s ->%(message)s')
    formatter = logging.Formatter('%(asctime)s -- %(name)s [%(levelname)s] %(message)s')
    file_handler = logging.FileHandler(f'log.log', mode='w')
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
     
    if __name__ == "__main__":
        print("hello")
        logger.info("etape0")
        function1()
    Dans chaque module, on suit simplement la doc ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import logging
    logger = logging.getLogger(f"APP.{__name__}")
     
    def function1():
        logger.warning("fonction1()")
    ici:
    - logger.addHandler() est appelé bien qu'une seule et unique fois ! dans main.py
    - les "logger" ont le même parent (donc les modules héritent du principal "APP.")
    ps: comme écrit dans mon code précédent, ces 2 choses sont faites par mes if "__main__" dans ton code ...

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/11/2015, 11h14
  2. Utilisation de Package Subgurim.Maps dans un projet ASP.Net WebForms C#
    Par Fredo97 dans le forum Développement Web avec .NET
    Réponses: 0
    Dernier message: 05/03/2014, 11h33
  3. Utiliser le package nomencl dans teXniccenter
    Par jacks1 dans le forum Mise en forme
    Réponses: 4
    Dernier message: 21/12/2011, 14h27
  4. Réponses: 1
    Dernier message: 13/03/2007, 08h34
  5. Réponses: 2
    Dernier message: 07/11/2006, 10h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo