1 #-*-coding:iso-8859-1-*-
3 # Copyright (C) 2008-2009 EDF R&D
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation; either
8 # version 2.1 of the License.
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # Lesser General Public License for more details.
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 Ce module permet de mettre en place un logging utilisable partout dans
23 l'application, par défaut à la console, et si nécessaire dans un fichier.
25 Il doit être appelé en premier dans AssimilationStudy (mais pas directement
26 dans les applications utilisateurs), en l'important et en instanciant un
28 import Logging ; Logging.Logging()
30 Par défaut, seuls les messages du niveau WARNING ou au-delà sont disponibles
31 (donc les simples messages d'info ne sont pas disponibles), ce que l'on peut
32 changer à l'instanciation avec le mot-clé "level" :
33 import Logging ; Logging.Logging(level=20)
35 On peut éventuellement demander à l'objet de sortir aussi les messages dans
36 un fichier (noms par défaut : AssimilationStudy.log, niveau NOTSET) :
37 import Logging ; Logging.Logging().setLogfile()
39 Si on veut changer le nom du fichier ou le niveau global de message, il faut
40 récupérer l'instance et appliquer les méthodes :
42 log = Logging.Logging()
44 log.setLevel(logging.DEBUG)
45 log.setLogfile(filename="toto.log", filemode="a", level=logging.WARNING)
46 et on change éventuellement le niveau avec :
47 log.setLogfileLevel(logging.INFO)
49 Ensuite, n'importe où dans les applications, il suffit d'utiliser le module
50 "logging" (avec un petit "l") :
52 log = logging.getLogger(NAME) # Avec rien (recommandé) ou un nom NAME
58 ou encore plus simplement :
62 Dans une application, à n'importe quel endroit et autant de fois qu'on veut,
63 on peut changer le niveau global de message en utilisant par exemple :
65 logging.setLevel(logging.DEBUG)
67 On rappelle les niveaux (attributs de "logging") et leur ordre :
68 NOTSET=0 < DEBUG=10 < INFO=20 < WARNING=30 < ERROR=40 < CRITICAL=50
70 __author__ = "Jean-Philippe ARGAUD - Octobre 2008"
75 from PlatformInfo import PlatformInfo
77 LOGFILE = os.path.join(os.path.abspath(os.curdir),"AssimilationStudy.log")
79 # ==============================================================================
81 def __init__(self, level=logging.WARNING):
83 Initialise un logging à la console pour TOUS les niveaux de messages.
86 format = '%(levelname)-8s %(message)s',
92 # Initialise l'affichage de logging
93 # ---------------------------------
96 logging.info( "--------------------------------------------------" )
97 logging.info( "Lancement de "+p.getName()+" "+p.getVersion() )
98 logging.info( "--------------------------------------------------" )
99 logging.info( "Versions logicielles :" )
100 logging.info( "- Python "+p.getPythonVersion() )
101 logging.info( "- Numpy "+p.getNumpyVersion() )
102 logging.info( "- Scipy "+p.getScipyVersion() )
105 def setLogfileLevel(self, level=logging.NOTSET ):
107 Permet de changer globalement le niveau des messages disponibles.
109 logging.getLogger().setLevel(level)
111 def setLogfile(self, filename=LOGFILE, filemode="w", level=logging.NOTSET):
113 Permet de disposer des messages dans un fichier EN PLUS de la console.
115 if self.__logfile is not None:
116 # Supprime le précédent mode de stockage fichier s'il exsitait
117 logging.getLogger().removeHandler(self.__logfile)
118 self.__logfile = logging.FileHandler(filename, filemode)
119 self.__logfile.setLevel(level)
120 self.__logfile.setFormatter(
121 logging.Formatter('%(asctime)s %(levelname)-8s %(message)s',
122 '%d %b %Y %H:%M:%S'))
123 logging.getLogger().addHandler(self.__logfile)
125 def setLogfileLevel(self, level=logging.NOTSET ):
127 Permet de changer le niveau des messages stockés en fichier. Il ne sera
128 pris en compte que s'il est supérieur au niveau global.
130 self.__logfile.setLevel(level)
134 Renvoie le niveau de Logging sous forme texte
136 return logging.getLevelName( logging.getLogger().getEffectiveLevel() )
138 # ==============================================================================
139 if __name__ == "__main__":
140 print '\n AUTODIAGNOSTIC \n'
143 l = Logging(level = logging.NOTSET)
145 logging.info("Message numéro 1 uniquement disponible sur console")
147 l.setLogfile(level = logging.WARNING)
148 if not os.path.isfile(LOGFILE):
149 raise ValueError("Le fichier de log \"%s\" n'a pas pu être créé."%LOGFILE)
151 logging.info("Message numéro 2 uniquement disponible sur console")
152 logging.warning("Message numéro 3 conjointement disponible sur console et fichier")
154 l.setLogfileLevel(logging.INFO)
156 logging.info("Message numéro 4 conjointement disponible sur console et fichier")
159 print " Le logging a été correctement initialisé. Le fichier suivant"
160 print " %s"%os.path.basename(LOGFILE)
161 print " a été correctement créé, et peut être effacé après vérification."