私は最近、プログラムで設定できるロギング レベルに応じてさまざまな量の出力を出力する、非常に軽量なロギング クラスが必要でした。しかし、デバッグ メッセージ、エラー、または警告を出力するたびにクラスをインスタンス化する必要はありませんでした。しかし、このロギング機能の機能をカプセル化し、グローバルを宣言せずに再利用できるようにしたいとも考えていました。
そこで、クラス変数と@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()