Salome HOME
Minor documentation and code review corrections (38)
[modules/adao.git] / src / daComposant / daCore / ExtendedLogging.py
index 8ed49480a99bab4433dd2e2a0f7c2d44826a52a3..e09b785ce7d2c3e11e1ecd3298377222e4f17caa 100644 (file)
@@ -1,6 +1,6 @@
-#-*-coding:iso-8859-1-*-
+# -*- coding: utf-8 -*-
 #
 #
-# Copyright (C) 2008-2017 EDF R&D
+# Copyright (C) 2008-2023 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 : AdaoOutputLogfile.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 functools
+import time
 from daCore import PlatformInfo
 
 from daCore import PlatformInfo
 
-LOGFILE = os.path.join(os.path.abspath(os.curdir),"AssimilationStudy.log")
+LOGFILE = os.path.join(os.path.abspath(os.curdir),"AdaoOutputLogfile.log")
 
 # ==============================================================================
 class ExtendedLogging(object):
     """
 
 # ==============================================================================
 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',
@@ -106,16 +107,20 @@ class ExtendedLogging(object):
         logging.info( "--------------------------------------------------" )
         logging.info( "Library availability:" )
         logging.info( "- Python.......: True" )
         logging.info( "--------------------------------------------------" )
         logging.info( "Library availability:" )
         logging.info( "- Python.......: True" )
-        logging.info( "- Numpy........: True" )
+        logging.info( "- Numpy........: "+str(PlatformInfo.has_numpy) )
         logging.info( "- Scipy........: "+str(PlatformInfo.has_scipy) )
         logging.info( "- Matplotlib...: "+str(PlatformInfo.has_matplotlib) )
         logging.info( "- Scipy........: "+str(PlatformInfo.has_scipy) )
         logging.info( "- Matplotlib...: "+str(PlatformInfo.has_matplotlib) )
-        logging.info( "- Gnuplot......: "+str(PlatformInfo.has_scipy) )
+        logging.info( "- Gnuplot......: "+str(PlatformInfo.has_gnuplot) )
         logging.info( "- Sphinx.......: "+str(PlatformInfo.has_sphinx) )
         logging.info( "- Nlopt........: "+str(PlatformInfo.has_nlopt) )
         logging.info( "Library versions:" )
         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( "- Python.......: "+p.getPythonVersion() )
+        logging.info( "- Numpy........: "+p.getNumpyVersion() )
+        logging.info( "- Scipy........: "+p.getScipyVersion() )
+        logging.info( "- Matplotlib...: "+p.getMatplotlibVersion() )
+        logging.info( "- Gnuplot......: "+p.getGnuplotVersion() )
+        logging.info( "- Sphinx.......: "+p.getSphinxVersion() )
+        logging.info( "- Nlopt........: "+p.getNloptVersion() )
         logging.info( "" )
 
     def setLogfile(self, filename=LOGFILE, filemode="w", level=logging.NOTSET):
         logging.info( "" )
 
     def setLogfile(self, filename=LOGFILE, filemode="w", level=logging.NOTSET):
@@ -123,7 +128,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)
@@ -134,8 +139,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)
 
@@ -145,6 +150,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')