明示的なロギング呼び出し(またはwarwarukが示唆するようにロギングデコレータ)が最も簡単なアプローチですが、論理foo
メソッドをによって実装するなどの命名トリックを実行する場合は、ロギングを自動化することができますFoo
。Pythonでは大文字と小文字が区別されるため、これらは個別に区別されます。次に__getattr__
、次のようなメソッドを実装します。
class AutoLogger(object):
def __getattr__(self, attr):
try:
return self.__class__.__dict__[attr]
except KeyError:
func = self.__class__.__dict__[attr.capitalize()]
return lambda *args, **kwargs: self.log_call(attr, func, *args, **kwargs)
def log_call(self, func_name, func, *args, **kwargs):
func(self, *args, **kwargs)
print func_name, 'has been called (handled by', func_name.capitalize() + ')'
class BigAutoLoggerClass(AutoLogger):
def Foo(self):
print 'calling Foo'
b = BigAutoLoggerClass()
b.Foo()
print "---"
b.foo()
これにより、次のようになります。
calling Foo
---
calling Foo
foo has been called (handled by Foo)
bar
同様に、などによって実装さBar
れます。
この名前の付け方が気に入らない場合は、関数を使用してロギングを自動化することもできsys.settrace()
ます。ただし、これにより実行時のオーバーヘッドが大幅に増加し、実際にはデバッグやパフォーマンスの低下に問題がない状況にのみ適しています。