J'ai récemment voulu un très léger-poids classe de log qui serait sortie des quantités variables de sortie en fonction du niveau d'enregistrement peut être réglée par programme. Mais je ne voulais pas d'instancier la classe à chaque fois que je voulais à la sortie d'un message de débogage ou d'erreur ou d'avertissement. Mais je voulais aussi encapsuler le fonctionnement de cette fonction de journalisation et de le rendre réutilisable sans la déclaration de toutes les variables globales.
Alors j'ai utilisé des variables de classe et l' @classmethod
décorateur pour atteindre cet objectif.
Avec ma classe de log, j'ai pu effectuer les opérations suivantes:
Logger._level = Logger.DEBUG
Alors, dans mon code, si je voulais cracher un tas d'informations de débogage, j'ai simplement eu à code
Logger.debug( "this is some annoying message I only want to see while debugging" )
Les erreurs pourraient être mis avec
Logger.error( "Wow, something really awful happened." )
Dans la "production" de l'environnement, je peux préciser
Logger._level = Logger.ERROR
et maintenant, seul le message d'erreur sera de sortie. Le message de débogage ne sera pas imprimé.
Voici ma classe:
class Logger :
''' Handles logging of debugging and error messages. '''
DEBUG = 5
INFO = 4
WARN = 3
ERROR = 2
FATAL = 1
_level = DEBUG
def __init__( self ) :
Logger._level = Logger.DEBUG
@classmethod
def isLevel( cls, level ) :
return cls._level >= level
@classmethod
def debug( cls, message ) :
if cls.isLevel( Logger.DEBUG ) :
print "DEBUG: " + message
@classmethod
def info( cls, message ) :
if cls.isLevel( Logger.INFO ) :
print "INFO : " + message
@classmethod
def warn( cls, message ) :
if cls.isLevel( Logger.WARN ) :
print "WARN : " + message
@classmethod
def error( cls, message ) :
if cls.isLevel( Logger.ERROR ) :
print "ERROR: " + message
@classmethod
def fatal( cls, message ) :
if cls.isLevel( Logger.FATAL ) :
print "FATAL: " + message
Et un peu de code qui teste juste un peu:
def logAll() :
Logger.debug( "This is a Debug message." )
Logger.info ( "This is a Info message." )
Logger.warn ( "This is a Warn message." )
Logger.error( "This is a Error message." )
Logger.fatal( "This is a Fatal message." )
if __name__ == '__main__' :
print "Should see all DEBUG and higher"
Logger._level = Logger.DEBUG
logAll()
print "Should see all ERROR and higher"
Logger._level = Logger.ERROR
logAll()