1

次の(擬似)コードに相当するものをPythonで実装することは可能ですか?

#define DEBUG(topic, msg) LOG_IMPL(Logger.DEBUG, topic, msg)
#define INFO(topic, msg) LOG_IMPL(Logger.INFO, topic, msg)
#define LOG_IMPL(level, topic, msg) if(Logger.level() <= level) { Logger.log(level, topic, msg); }

DEBUG("MyComponent", "What you logging at?")

ここでの利点は、文字列の結合、.format()の呼び出しなど、文字列ログメッセージを評価する必要がないことです。)

更新

怠惰なロガーメッセージ文字列の評価-これは私の質問に答えるので、この投稿を閉じることに投票します。

4

4 に答える 4

9

Pythonにはバッテリーが含まれており、alogging moduleはstdlibの一部です。

from logging import getLogger

log = getLogger('my.module')

log.debug('Debug level messages')
log.warning('Warning!')
log.info('Informative message')
log.error('Error messages')
log.exception('Use this in an exception handler, the exception will be included automatically')

上記のメソッドのセットは、log.log(level, msg)任意の(整数)レベルを取り、loggingモジュールDEBUGが、WARNINGおよびその他のレベルを定義するメソッドのショートカットです。

メソッドは、 Python文字列フォーマットテンプレートの遅延評価をサポートします。追加の引数は、メッセージのログレベルが実際に記録されているログレベルを超えた場合にのみ補間されます。

log.warning('Warning message: the %s is missing %i frobnars', systemname, count)

上記のメッセージは'Warning message: the %s is missing %i frobnars' % (systemname, count)、ログメッセージが実際にハンドラーに到達した場合にのみ同等のログが記録されます。

于 2012-06-24T20:16:46.963 に答える
2

メッセージにラムダを使用するのはどうですか?

log( lambda : (string1 + string2 + "%d %d" % (val1, val2)) )

また、ログ機能が有効になっている場合にのみ、渡された関数を呼び出すようにします。

于 2012-06-24T20:15:27.790 に答える
1

loggingモジュールを試しましたか?例:

import logging
logging.basicConfig(filename='example.log',level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

ソース:http ://docs.python.org/howto/logging.html#logging-basic-tutorial

于 2012-06-24T20:19:19.720 に答える
0

小さなロギングプロキシクラス内にカスタムフォーマッターとハンドラーをカプセル化しながら、ログメッセージの遅延評価を可能にするソリューションを思いつきました。

ログメッセージが書き込まれない限り、フォーマット文字列は評価されません(ロギングがこれを処理します)。これは、フォーマット文字列と引数を別々に渡すことによって実現されます。

@classmethod 
def info(cls, component, msg, *args):     
    """Log an info message"""     
    cls.__log(cls.Level.INFO, component, msg, (args)  

@classmethod 
def __log(cls, level, component, msg, *args):    
    """Log a message at the requested level"""     
    logging.getLogger("local").log(level, " - ".join([component, msg.format(*args)])) 

Logger.info("MyComponent", "My message with arg '{0}'", "TestArg")
于 2012-06-26T09:53:36.460 に答える