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 :

fermer le fichier de log [Python 3.X]


Sujet :

Python

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut fermer le fichier de log
    Bonjour,

    Dans un module python, je crée un logger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    logging.basicConfig(filename='myfilename.log', \
                            level=logging.DEBUG, \
                            format='%(asctime)s -- %(name)s -- %(levelname)s -- %(message)s')
     
     
    log = logging.getLogger('mylog')
     
    log.debug('This message should go to the log file')

    Le message est bien écrit dans le fichier log, mais quand je veux supprimer le fichier crée, j'ai un message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cette action ne peut être réalisée car le fichier est ouvert dans Python
    Je travaille dans Spyder pour mon developpement Python.
    Comment faire pour fermer le fichier log crée à la fin du script ?


    Merci,
    Nico

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Probablement cela :
    https://docs.python.org/3/library/lo...gging.shutdown

    NB : Si votre code a planté au milieu de son exécution, alors il se peut fortement que vous deviiez fermer et réouvrir spyder.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Avec shutdown, je peux maintenant supprimer le fichier log.

    Dans le basicConfig, je crée le nom de mon fichier log avec l'heure HHMMSS, pour bien identifier chaque lancement du script.
    Si je lance une première fois le script, le fichier log est bien crée, et le script écrit bien dedans.

    Si je relance une deuxième fois le script, le fichier log correspondant n'est pas crée, et le script écrit dans le fichier log crée à la première étape.
    Donc il semble qu'il y ait quelquechose qui ne soit pas réinitialisé à chaque lancement du script, malgré le shutdown.

    Nico

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    1) Le problème que vous décrivez à présent n'est pas le même
    2) Pour ce nouveau problème, quand vous écrivez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    logging.basicConfig(filename='myfilename.log'
    et bien vos log sont écrit dans 'myfilename.log'. Pourquoi ça changerait d'une exécution sur l'autre ? Vous indiquez à logging le nom 'myfilename.log', alors logging vous écrit le log là dedans ! Si vous voulez changer de fichier, et bien il faut lui mettre un nom moins trivial, qui soit composé par exemple de la date et de l'heure dans le nom lui meme du fichier de log.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        dt = datetime.datetime.today().strftime('%Y%m%d%H%M%S')
     
        logging.basicConfig(filename='"{}/log{}.log"'.format(os.path.dirname(os.path.dirname(__file__)), dt), \
                            level=logging.DEBUG, \
                            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    Ca crée bien un fichier log la première fois que je lance le script, mais si je relance ensuite, ça écrit toujours dans le fichier log crée la première fois.

    Nico

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par DiverSIG Voir le message
    Ca crée bien un fichier log la première fois que je lance le script, mais si je relance ensuite, ça écrit toujours dans le fichier log crée la première fois.
    Un print (dt) vous permettrait de vérifier que çà change à chaque exécution sinon soit vous n'exécuter pas votre script normalement soit l'horloge système est en panne.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    le print(dt) m'indique bien la date/heure de lancement du script.
    Si je met une instruction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.mkdir('Session{}'.format(dt))
    le répertoire est bien crée.

    J'ai réduit le script au plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        dt = datetime.datetime.today().strftime('%Y%m%d%H%M%S')
        directory = 'Session{}'.format(dt)
        print(directory)
        os.mkdir('Session{}'.format(dt))
     
        logging.basicConfig(filename='log{}.log'.format(dt), \
                            level=logging.DEBUG, \
                            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
     
        print(dt)
        log = logging.getLogger('mylog')
     
        log.debug('This message should go to the log file')
        logging.shutdown()
    Nico

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Mettez vos instructions dans un fichier script.py et lancez le depuis un terminal avec la commande python script.py.
    Si vous le lancez 2 fois, vous devriez avoir deux fichiers log.
    Sinon, on aura de quoi reproduire le problème avec le mode d'emploi.

    N'oubliez pas que logging est un "singleton", ce qui signifie qu'on ne l'initialise (par défaut) qu'une seule fois (jusqu'au lancement suivant du programme).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Je prend pour exemple ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import datetime
    import logging
     
    dt = datetime.datetime.today().strftime('%Y%m%d%H%M%S')
    print(dt) 
     
    logging.basicConfig(filename='log{}.log'.format(dt), \
                        level=logging.DEBUG, \
                        format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
     
    log = logging.getLogger('mylog')
    logging.debug('This message should go to the log file')
    logging.shutdown()
    - Si vous l'éxécutez 2 fois d'affilé, en exécutant en ligne de commande depuis la console système, vous obtenez bien 2 fichier de log différents.
    - Si vous l'exécutez dans spyder 2 fois d'affilé, effectivement vous avez tous dans le meme log, bien que les dt affichés soit différents

    Donc à partir de là j'ai creusé. Si dans IPython, entre les 2 exécutions, vous faites un "restart kernel", là ca fonctionne vous avez bien 2 fichier log distincts. Il semblerait que ce soit un bug de IPython donc, comme mentionné ici :https://github.com/spyder-ide/spyder/issues/2572

    Voici une solution donnée dans les commentaires en attendant, pour continuer à utiliser spyder, sans avoir à redémarrer le noyau à chaque fois est de faire les import comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import datetime
    import logging
     
    import importlib
    importlib.reload(logging)

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    super, ça marche !

    Merci,
    Nico

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fermer un fichier log dans une boucle for
    Par _junior_ dans le forum Général Python
    Réponses: 4
    Dernier message: 25/11/2019, 11h11
  2. [tomcat 5] [paramétrage] fichier de log System.out.println
    Par Aldo dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 22/02/2005, 14h41
  3. [Oracle 8i/Fichier de log] - fichier log pour analyse erreur
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 4
    Dernier message: 25/01/2005, 19h06
  4. [Tomcat] Fichier de logs
    Par yolepro dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 22/03/2004, 16h20
  5. Fichiers de Log
    Par Mouse dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/05/2003, 18h06

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