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 :

Logging et multiprocess [Python 2.X]


Sujet :

Python

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Par défaut Logging et multiprocess
    Bonjour a tous,

    J'ai un petit problème avec l'utilisation du logging python.
    En effet, j'utilise Logging dans un script qui peux être appeler plusieurs fois en simultané.
    Résultat je me retrouve avec plusieurs fichier de log.
    Dans mon code, sa donne des choses de ce type: activity.log, activity.log.1, activity.log.2 , etc....

    Voici l'extrait de mon code qui gère la création du logger.
    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
    from logging.handlers import RotatingFileHandler
     
    ....
    ....
     
    self.logger = logging.getLogger('myScriptName')
    self.logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s')
    file_handler = RotatingFileHandler(self.logFilePath, 'a', 10000, 1)
    file_handler.setLevel(logging.DEBUG)
    file_handler.setFormatter(formatter)
    self.logger.addHandler(file_handler)

    Avez vous une idée de comment ne pas avoir cette "duplication" de log ?
    Savez vous comment faire pour que tout "entre" dans le même log ?

    Merci d'avance pour votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Généralement on instancie le logger dans __main__, même si ce n'est pas nécessaire. Il suffit alors d'ajouter, dans les scripts importés où les logs sont utilisés, cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    import logging
    logger = logging.getLogger(__name__)

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Par défaut
    Je ne comprend pas bien ta réponse.

    En gros, je n'ai qu'un seul fichier avec deux class.
    Ce fichier peux être appeler plusieurs fois simultanément par un autre exécutable.

    Donc j'ai bien un __main__, mais celui ci ne fait que une création d'objet et un appel de methode.
    Donc je ne vois pas trop la différence entre ce que je vais actuellement et ce que tu me dit de faire.

    Voici l'exemple minimal de mon projet
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #!/usr/bin/python
     
    import sys
    import os.path
    import os
    import shutil
    import re
    import logging
    from logging.handlers import RotatingFileHandler
    from ftplib import FTP
     
     
    class Toto:
     
    	def __init__(self):
     
    		self.logFilePath = '/data/Videos/activity.log'
     
    		self.logger = logging.getLogger('TOTO')
    		self.logger.setLevel(logging.DEBUG)
    		formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s')
    		file_handler = RotatingFileHandler(self.logFilePath, 'a', 10000, 1)
    		file_handler.setLevel(logging.DEBUG)
    		file_handler.setFormatter(formatter)
    		self.logger.addHandler(file_handler)
     
    	def process(self):
    		self.logger.debug("TEST")
     
     
    if __name__ == '__main__':
     
    	tata = Toto()
    	tata.process()

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Citation Envoyé par hannibal.76 Voir le message
    ...
    Ce fichier peux être appeler plusieurs fois simultanément par un autre exécutable.
    C'est celui-là qui doit instancier le logger. Il est logique que si tu recrées un logger, celui-ci n'a pas connaissance des précédents et créera systématiquement un nouveau fichier.

    Si ce n'est pas possible, éventuellement ajoute une routine qui supprime les anciens logs.

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Par défaut
    J'ai pas les source de l'appelant.

    Je ne comprend pas car lorsque mon script est utilisé plusieurs fois sans simultanéité, le fichier de log est bien mis a jour.
    Mais lorsque mon script est utilisé plusieurs fois en simultané, différent fichier de log son créé.

    Pourtant dans les deux cas, le logger est recréer a chaque fois.

  6. #6
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Qu'est-ce-que tu appelles simultanéité ?

    Si le script est importé le logger est créé mais pas si ses classes, fonctions ou autres sont réutilisés sans un nouvel import.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    Par défaut
    Salut,

    "logging" est plutôt fait pour les "serveurs" i.e. une seule instance du programme tourne à la fois.
    Démarrer plusieurs fois la même application et vouloir que les records de logging aillent dans le même fichier ne fonctionne pas.
    note: si on est avec plusieurs utilisateurs, on pourra écrire le log dans un s/répertoire du "HOME".

    La question serait plutôt de comprendre quel est l'intérêt de faire cela (i.e. en supposant que cela fonctionne comment exploiter le "log" après...)

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

  8. #8
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Par défaut
    En gros ce script est appelé a la fin d'une tache exécuté par un serveur.
    Il peut y avoir une ou plusieurs de ces taches qui ce termine en même temps (ou dans un temps plus court que le temps d’exécution de mon script python.)

    Donc je peux avoir plusieurs instance de mon script qui s’exécute en parallèle.
    Le script de log ainsi générer est synchronisé sur une autre machine. Celle-ci se charge de l'analyse du log.

    Alors le problème est que lorsqu'il y a plusieurs fichier de générer, le process global ne fonctionne plus.

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    Par défaut
    Salut,

    Si vous lisez la documentation, çà dit:
    Although logging is thread-safe, and logging to a single file from multiple threads in a single process is supported, logging to a single file from multiple processes is not supported, because there is no standard way to serialize access to a single file across multiple processes in Python. If you need to log to a single file from multiple processes, one way of doing this is to have all the processes log to a SocketHandler,...
    Ce qui n'est qu'une façon parmi d'autres de sérialiser les accès au fichier de sortie.

    Il y en a d'autres mais rien de paramètable côté "logging", c'est un design à choisir et du code à écrire.

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

  10. #10
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Par défaut
    Donc ma seule solution est de faire tourné un "serveur de log". On lui envoie les messages et c'est lui qui fait l’écriture.

    Je vous remercie pour votre aide

  11. #11
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    Par défaut
    Citation Envoyé par hannibal.76 Voir le message
    Donc ma seule solution est de faire tourné un "serveur de log". On lui envoie les messages et c'est lui qui fait l’écriture.
    Je suppose que vous vous êtes embarqué la dedans pour résoudre un problème.
    Passer par le module logging ne fonctionne pas aussi simplement.
    Ceci dit, modulo certaines restrictions, la plupart des OS supportent une atomicité des appends à un fichier.
    note: çà veut dire qu'en virant logging et en écrivant vos lignes directement dans le fichier ouvert en mode append, çà devrait fonctionner pourvu qu'elles soient inférieures à 1024 bytes (sur Windows, pour Linux c'est plus grand.. Mais il faut regarder la littérature pour savoir ce qui s'applique chez vous).

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

  12. #12
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 389
    Par défaut
    Effectivement, j'ai juste coder une autre class de loggin qui ouvre/ecrie/ferme le fichier a chaque appel.
    Et hop plus de problème

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

Discussions similaires

  1. [Log4j]Cherche visualiseur de fichiers logs de log4j
    Par RolandB dans le forum Logging
    Réponses: 9
    Dernier message: 18/03/2009, 15h11
  2. Réponses: 16
    Dernier message: 30/01/2004, 11h05
  3. Supprimer journal de log en SQL
    Par David K. dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 24/07/2003, 08h35
  4. Fichiers de Log
    Par Mouse dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/05/2003, 18h06
  5. [] [Stratégie] Comment créer un fichier log
    Par Skeezo dans le forum Installation, Déploiement et Sécurité
    Réponses: 4
    Dernier message: 16/09/2002, 18h30

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