X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FdaComposant%2FdaCore%2FExtendedLogging.py;h=e09b785ce7d2c3e11e1ecd3298377222e4f17caa;hb=a6845547d27bcdc0928f898a4c8a2e4fc276c69e;hp=afc33872ee8037d02095db5de69186c2132aa7d5;hpb=18e5a3a3aba5d79dc62401416f86774840c15c8a;p=modules%2Fadao.git diff --git a/src/daComposant/daCore/ExtendedLogging.py b/src/daComposant/daCore/ExtendedLogging.py index afc3387..e09b785 100644 --- a/src/daComposant/daCore/ExtendedLogging.py +++ b/src/daComposant/daCore/ExtendedLogging.py @@ -1,6 +1,6 @@ -#-*-coding:iso-8859-1-*- +# -*- coding: utf-8 -*- # -# Copyright (C) 2008-2016 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 @@ -22,36 +22,35 @@ """ 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() - 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 - changer à l'instanciation avec le mot-clé "level" : + changer à l'instanciation avec le mot-clé "level" : 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 - 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) - et on change éventuellement le niveau avec : + et on change éventuellement le niveau avec : 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 - 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("...") @@ -61,10 +60,10 @@ 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 - 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 : @@ -76,19 +75,21 @@ __all__ = [] 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") +LOGFILE = os.path.join(os.path.abspath(os.curdir),"AdaoOutputLogfile.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): """ - 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', @@ -102,12 +103,24 @@ class ExtendedLogging(object): p = PlatformInfo.PlatformInfo() # logging.info( "--------------------------------------------------" ) - logging.info( "Lancement de "+p.getName()+" "+p.getVersion() ) + logging.info( p.getName()+" version "+p.getVersion() ) 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........: "+str(PlatformInfo.has_numpy) ) + logging.info( "- Scipy........: "+str(PlatformInfo.has_scipy) ) + logging.info( "- Matplotlib...: "+str(PlatformInfo.has_matplotlib) ) + 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( "- 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): @@ -115,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: - # 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) @@ -126,8 +139,8 @@ class ExtendedLogging(object): 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) @@ -137,6 +150,18 @@ class ExtendedLogging(object): """ 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__": - print '\n AUTODIAGNOSTIC \n' + print('\n AUTODIAGNOSTIC\n')