在子类化logging.Handler
时,我可以通过执行以下操作来创建自定义处理程序:
import requests
import logging
class RequestsHandler(logging.Handler):
def emit(self, record):
res = requests.get('http://google.com')
print (res, record)
handler = RequestsHandler()
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.warning('ok!')
# <Response [200]> <LogRecord: __main__, 30, <stdin>, 1, "ok!">
如果它只是一个没有子类化logging.Handler
的基类,那么最简单的RequestHandler
(也就是说,它需要什么方法?)
查看} ,它只调用处理程序上的
Logger.log
的源代码可以找到^{handle
。因此,如果您将假处理程序直接注入到记录器实例中,那么这可能是您所需要的最小值如果您真的想保证与日志模块的其余部分兼容,那么您唯一能做的就是查看模块的源代码以了解它是如何工作的The documentation是一个很好的起点,但这并没有深入到内部
如果您只是尝试为一个小用例编写一个虚拟处理程序,那么您可以跳过很多步骤;尝试一些东西,看看哪里失败了,然后在此基础上再接再厉
否则,你就别无选择,只能深入到源代码中去(尽管尝试一些东西,看看有什么突破也可以是一个很好的方法来找到地方开始阅读)
快速浏览一下the class' source就知道类中唯一的gotchas与模块对其对象的内部管理有关
Handler.__init__
将处理程序放入全局处理程序列表中,模块可以在任意位置使用该列表。但除此之外,这门课非常简单;它不应该太难读一般来说,您可以通过使用包装函数重写
__getattribue__
方法来找出类的哪些属性是从外部访问的 如果调用者的类与当前类不同,则将要访问的属性的名称添加到集合中:以便:
输出:
演示:https://repl.it/@blhsing/UtterSoupyCollaborativesoftware
从上面的结果可以看出,} 方法中直接访问:
handle
和level
是基本日志处理程序所需的唯一属性。换句话说,@jirassimok是正确的,因为handle
是Handler
类的唯一外部调用的方法,但是也需要实现level
属性,因为它也可以在^{其中
level
属性必须是整数,如果要处理所有日志记录级别的记录,则应为0
因此,
Handler
类的最小实现应该类似于:以便:
输出:
相关问题 更多 >
编程相关推荐