Python中可以使用C ++样式的日志记录宏吗?

时间:2012-06-24 20:11:33

标签: python c++ logging macros

是否可以在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()等。)

更新

Lazy logger message string evaluation - 这回答了我的问题所以我会投票结束这篇文章。

4 个答案:

答案 0 :(得分:9)

Python附带电池,logging 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模块定义DEBUGWARNING和其他级别

这些方法支持python string formatting templates的惰性评估;当消息的日志级别实际超过记录的日志记录级别时,额外的参数将仅插入

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

只有当日志消息实际到达处理程序时,才会记录上述消息,其等效值为'Warning message: the %s is missing %i frobnars' % (systemname, count)

答案 1 :(得分:1)

如何使用lambdas作为消息:

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

如果启用了日志记录,则让log函数只调用传入的函数。

答案 2 :(得分: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

答案 3 :(得分: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")