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

对消息使用 lambdas 怎么样:

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 回答