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

2 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"
Run Code Online (Sandbox Code Playgroud)

我想到的实施如下:

 #!/usr/bin/python

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

 """

 myobject = test()
 try:
     myobject.do_something()
 except SomeError:
     logger.log("cant do something")
Run Code Online (Sandbox Code Playgroud)

d like to get my basics strong, i很感激您可能建议我查找的代码的任何帮助和建议.

Thnkx!

Vin*_*jip 9

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

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

  1. 您不需要将记录器作为实例成员.使用模块级别声明记录器更自然logger = logging.getLogger(__name__),这也可以在子包中按预期工作.
  2. 你的调用logger.log("message")可能会失败,因为log方法有一个级别作为第一个参数,而不是消息.

您应该声明处理程序,如果您的使用场景非常简单,您可以if __name__ == '__main__':通过添加例如main方法或子句来执行此操作

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

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

import logging
logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)

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

logger.debug('message with %s', 'arguments') # or .info, .warning, .error etc.
Run Code Online (Sandbox Code Playgroud)

在任何需要的代码中.