日志记录机制的差异:API和应用程序(python)

时间:2010-04-13 15:37:40

标签: python api logging

我目前正在编写API和使用API​​的应用程序。我得到了人们的建议,说我应该在应用程序中使用处理程序执行日志记录,并使用“logger”对象从API进行日志记录。

根据我上面收到的建议,以下实施是否正确?

class test:
    def __init__(self, verbose):
        self.logger = logging.getLogger("test")
        self.logger.setLevel(verbose)

    def do_something(self):
        # do something
        self.logger.log("something")
        # by doing this i get the error message "No handlers could be found for logger "test"

我想到的实现如下:

 #!/usr/bin/python

 """ 
 ....
 ....
 create a logger with a handler 
 ....
 ....

 """

 myobject = test()
 try:
     myobject.do_something()
 except SomeError:
     logger.log("cant do something")

d like to get my basics strong, i感谢您建议我查找的代码的任何帮助和建议。

Thnkx!

3 个答案:

答案 0 :(得分:8)

目前还不是很清楚你的问题是关于如何使用日志记录或记录异常的细节,但如果是后者,我会同意Adam Crossland的说法,即log-and-swallow是一种需要避免的模式。

就伐木机制而言,我会做出以下观察:

  1. 您不需要将记录器作为实例成员。使用logger = logging.getLogger(__name__)在模块级别声明记录器更自然,这也可以在子包中按预期工作。
  2. 你的调用logger.log(“message”)可能会失败,因为log方法有一个级别作为第一个参数,而不是消息。
  3. 您应该声明处理程序,如果您的使用场景非常简单,您可以在main方法或if __name__ == '__main__':子句中添加例如

    logging.basicConfig(filename='/tmp/myapp.log', level=logging.DEBUG, 
                        format='%(asctime)s %(levelname)s %(name)s %(message)s')
    

    然后代码中的其他地方,例如

    import logging
    logger = logging.getLogger(__name__)
    

    一旦位于要使用日志记录的每个模块的顶部,然后

    logger.debug('message with %s', 'arguments') # or .info, .warning, .error etc.
    

    在你的代码中的任何地方。

答案 1 :(得分:2)

您正在考虑的模式的危险在于,您最终可能会通过将异常放入日志中来有效地隐藏异常。许多异常确实会导致程序崩溃,因为它们代表了需要修复的问题。通常,能够使用调试器进入代码以找出导致异常的原因更为有用。

如果存在异常表示不影响应用程序稳定性或其行为正确性的预期条件,则只需在日志中写入符号即可。但要非常非常小心你如何使用它。

答案 2 :(得分:1)

我通常会做以下事情:

import logging
import logging.config
logging.config.fileConfig('log.congig')

# for one line log records 
G_LOG = logging.getLogger(__name__)
# for records with stacktraces
ST_LOG = logging.getLogger('stacktrace.' + __name__)


try:
    # some code
    G_LOG.info('some message %s %s', param1, param2)
except (StandardError,):
    message = 'some message'
    G_LOG.error(message)
    # exc_info appends stacktrace to the log message
    ST_LOG.error(message, exc_info=True)

配置文件的格式可以在python manual

中看到