Salome HOME
Minor improvements for internal variables
[modules/adao.git] / src / daComposant / daCore / ExtendedLogging.py
index afc33872ee8037d02095db5de69186c2132aa7d5..c67f0308290c16e5afdb48bdb6a3cade37cff9f3 100644 (file)
@@ -1,6 +1,6 @@
-#-*-coding:iso-8859-1-*-
+# -*- coding: utf-8 -*-
 #
 #
-# Copyright (C) 2008-2016 EDF R&D
+# Copyright (C) 2008-2021 EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
 
 """
     Ce module permet de mettre en place un logging utilisable partout dans
 
 """
     Ce module permet de mettre en place un logging utilisable partout dans
-    l'application, par défaut à la console, et si nécessaire dans un fichier.
+    l'application, par défaut à la console, et si nécessaire dans un fichier.
 
 
-    Il doit être appelé en premier dans AssimilationStudy (mais pas directement
-    dans les applications utilisateurs), en l'important et en instanciant un
-    objet :
+    Il doit être appelé en premier dans Aidsm (mais pas directement dans les
+    applications utilisateurs), en l'important et en instanciant un objet :
         import ExtendedLogging ; ExtendedLogging.ExtendedLogging()
 
         import ExtendedLogging ; ExtendedLogging.ExtendedLogging()
 
-    Par défaut, seuls les messages du niveau WARNING ou au-delà sont disponibles
+    Par défaut, seuls les messages du niveau WARNING ou au-delà sont disponibles
     (donc les simples messages d'info ne sont pas disponibles), ce que l'on peut
     (donc les simples messages d'info ne sont pas disponibles), ce que l'on peut
-    changer à l'instanciation avec le mot-clé "level" :
+    changer à l'instanciation avec le mot-clé "level" :
         import ExtendedLogging ; ExtendedLogging.ExtendedLogging(level=20)
 
         import ExtendedLogging ; ExtendedLogging.ExtendedLogging(level=20)
 
-    On peut éventuellement demander à l'objet de sortir aussi les messages dans
-    un fichier (noms par défaut : AssimilationStudy.log, niveau NOTSET) :
+    On peut éventuellement demander à l'objet de sortir aussi les messages dans
+    un fichier (noms par défaut : Aidsm.log, niveau NOTSET) :
         import ExtendedLogging ; ExtendedLogging.ExtendedLogging().setLogfile()
 
     Si on veut changer le nom du fichier ou le niveau global de message, il faut
         import ExtendedLogging ; ExtendedLogging.ExtendedLogging().setLogfile()
 
     Si on veut changer le nom du fichier ou le niveau global de message, il faut
-    récupérer l'instance et appliquer les méthodes :
+    récupérer l'instance et appliquer les méthodes :
         import ExtendedLogging
         log = ExtendedLogging.ExtendedLogging()
         import logging
         log.setLevel(logging.DEBUG)
         log.setLogfile(filename="toto.log", filemode="a", level=logging.WARNING)
         import ExtendedLogging
         log = ExtendedLogging.ExtendedLogging()
         import logging
         log.setLevel(logging.DEBUG)
         log.setLogfile(filename="toto.log", filemode="a", level=logging.WARNING)
-    et on change éventuellement le niveau avec :
+    et on change éventuellement le niveau avec :
         log.setLogfileLevel(logging.INFO)
 
         log.setLogfileLevel(logging.INFO)
 
-    Ensuite, n'importe où dans les applications, il suffit d'utiliser le module
+    Ensuite, n'importe où dans les applications, il suffit d'utiliser le module
     "logging" (avec un petit "l") :
         import logging
     "logging" (avec un petit "l") :
         import logging
-        log = logging.getLogger(NAME) # Avec rien (recommandé) ou un nom NAME
+        log = logging.getLogger(NAME) # Avec rien (recommandé) ou un nom NAME
         log.critical("...")
         log.error("...")
         log.warning("...")
         log.critical("...")
         log.error("...")
         log.warning("...")
         import logging
         logging.info("...")
 
         import logging
         logging.info("...")
 
-    Dans une application, à n'importe quel endroit et autant de fois qu'on veut,
+    Dans une application, à n'importe quel endroit et autant de fois qu'on veut,
     on peut changer le niveau global de message en utilisant par exemple :
         import logging
     on peut changer le niveau global de message en utilisant par exemple :
         import logging
-        log = logging.getLogger(NAME) # Avec rien (recommandé) ou un nom NAME
+        log = logging.getLogger(NAME) # Avec rien (recommandé) ou un nom NAME
         log.setLevel(logging.DEBUG)
 
     On rappelle les niveaux (attributs de "logging") et leur ordre :
         log.setLevel(logging.DEBUG)
 
     On rappelle les niveaux (attributs de "logging") et leur ordre :
@@ -76,19 +75,21 @@ __all__ = []
 import os
 import sys
 import logging
 import os
 import sys
 import logging
-import PlatformInfo
+import functools
+import time
+from daCore import PlatformInfo
 
 LOGFILE = os.path.join(os.path.abspath(os.curdir),"AssimilationStudy.log")
 
 # ==============================================================================
 class ExtendedLogging(object):
     """
 
 LOGFILE = os.path.join(os.path.abspath(os.curdir),"AssimilationStudy.log")
 
 # ==============================================================================
 class ExtendedLogging(object):
     """
-    Logger général pour disposer conjointement de la sortie standard et de la
+    Logger général pour disposer conjointement de la sortie standard et de la
     sortie sur fichier
     """
     def __init__(self, level=logging.WARNING):
         """
     sortie sur fichier
     """
     def __init__(self, level=logging.WARNING):
         """
-        Initialise un logging à la console pour TOUS les niveaux de messages.
+        Initialise un logging à la console pour TOUS les niveaux de messages.
         """
         logging.basicConfig(
             format = '%(levelname)-8s %(message)s',
         """
         logging.basicConfig(
             format = '%(levelname)-8s %(message)s',
@@ -102,12 +103,20 @@ class ExtendedLogging(object):
         p = PlatformInfo.PlatformInfo()
         #
         logging.info( "--------------------------------------------------" )
         p = PlatformInfo.PlatformInfo()
         #
         logging.info( "--------------------------------------------------" )
-        logging.info( "Lancement de "+p.getName()+" "+p.getVersion() )
+        logging.info( p.getName()+" version "+p.getVersion() )
         logging.info( "--------------------------------------------------" )
         logging.info( "--------------------------------------------------" )
-        logging.info( "Versions logicielles :" )
-        logging.info( "- Python "+p.getPythonVersion() )
-        logging.info( "- Numpy "+p.getNumpyVersion() )
-        logging.info( "- Scipy "+p.getScipyVersion() )
+        logging.info( "Library availability:" )
+        logging.info( "- Python.......: True" )
+        logging.info( "- Numpy........: True" )
+        logging.info( "- Scipy........: "+str(PlatformInfo.has_scipy) )
+        logging.info( "- Matplotlib...: "+str(PlatformInfo.has_matplotlib) )
+        logging.info( "- Gnuplot......: "+str(PlatformInfo.has_scipy) )
+        logging.info( "- Sphinx.......: "+str(PlatformInfo.has_sphinx) )
+        logging.info( "- Nlopt........: "+str(PlatformInfo.has_nlopt) )
+        logging.info( "Library versions:" )
+        logging.info( "- Python.......: "+p.getPythonVersion() )
+        logging.info( "- Numpy........: "+p.getNumpyVersion() )
+        logging.info( "- Scipy........: "+p.getScipyVersion() )
         logging.info( "" )
 
     def setLogfile(self, filename=LOGFILE, filemode="w", level=logging.NOTSET):
         logging.info( "" )
 
     def setLogfile(self, filename=LOGFILE, filemode="w", level=logging.NOTSET):
@@ -115,7 +124,7 @@ class ExtendedLogging(object):
         Permet de disposer des messages dans un fichier EN PLUS de la console.
         """
         if self.__logfile is not None:
         Permet de disposer des messages dans un fichier EN PLUS de la console.
         """
         if self.__logfile is not None:
-            # Supprime le précédent mode de stockage fichier s'il exsitait
+            # Supprime le précédent mode de stockage fichier s'il exsitait
             logging.getLogger().removeHandler(self.__logfile)
         self.__logfile = logging.FileHandler(filename, filemode)
         self.__logfile.setLevel(level)
             logging.getLogger().removeHandler(self.__logfile)
         self.__logfile = logging.FileHandler(filename, filemode)
         self.__logfile.setLevel(level)
@@ -126,8 +135,8 @@ class ExtendedLogging(object):
 
     def setLogfileLevel(self, level=logging.NOTSET ):
         """
 
     def setLogfileLevel(self, level=logging.NOTSET ):
         """
-        Permet de changer le niveau des messages stockés en fichier. Il ne sera
-        pris en compte que s'il est supérieur au niveau global.
+        Permet de changer le niveau des messages stockés en fichier. Il ne sera
+        pris en compte que s'il est supérieur au niveau global.
         """
         self.__logfile.setLevel(level)
 
         """
         self.__logfile.setLevel(level)
 
@@ -137,6 +146,18 @@ class ExtendedLogging(object):
         """
         return logging.getLevelName( logging.getLogger().getEffectiveLevel() )
 
         """
         return logging.getLevelName( logging.getLogger().getEffectiveLevel() )
 
+# ==============================================================================
+def logtimer(f):
+    @functools.wraps(f)
+    def wrapper(*args, **kwargs):
+        start  = time.clock() # time.time()
+        result = f(*args, **kwargs)
+        end    = time.clock() # time.time()
+        msg    = 'TIMER Durée elapsed de la fonction utilisateur "{}": {:.3f}s'
+        logging.debug(msg.format(f.__name__, end-start))
+        return result
+    return wrapper
+
 # ==============================================================================
 if __name__ == "__main__":
 # ==============================================================================
 if __name__ == "__main__":
-    print '\n AUTODIAGNOSTIC \n'
+    print('\n AUTODIAGNOSTIC\n')