私は最近、プログラムで設定できるロギングレベルに応じてさまざまな量の出力を出力する、非常に軽量なロギングクラスが必要でした。しかし、デバッグメッセージ、エラー、または警告を出力するたびにクラスをインスタンス化したくありませんでした。しかし、このロギング機能の機能をカプセル化し、グローバルを宣言せずに再利用できるようにしたいと思っていました。
そこで、クラス変数と@classmethod
デコレーターを使用してこれを実現しました。
私の単純なLoggingクラスを使用すると、次のことができます。
Logger._level = Logger.DEBUG
次に、私のコードで、大量のデバッグ情報を吐き出したい場合は、
Logger.debug( "this is some annoying message I only want to see while debugging" )
エラーは出力される可能性があります
Logger.error( "Wow, something really awful happened." )
「本番」環境では、指定できます
Logger._level = Logger.ERROR
そして今、エラーメッセージのみが出力されます。デバッグメッセージは出力されません。
これが私のクラスです:
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
そして、それを少しだけテストするいくつかのコード:
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()