在我的项目中,我有一组通过调用外部命令来完成某些工作并返回结果的类。我们称它们为“报告”。
我想将日志记录添加到这些报告中,但是,将在运行时而不是在定义类时定义具体的记录器对象。
所以,现在我看到了两个如何实现日志记录的变体:
I. 在运行时,实例化一些ReportLogger
类实例,它可以使用给定的具体记录器对所有给定的报告实例进行猴子修补,并具有日志记录功能。
优点:
- 可以将日志记录应用到我真正需要的任何子报表类,而不涉及其他类。
缺点:
- 魔法!猴子修补不是明确的做事方式。
- 日志记录实际上是在运行时应用的,因此在查看报告类代码时很难理解是否存在一些日志记录。
二、单例ReportLogger
类,在创建时通过装饰器包装所有报告,但在运行时接受具体记录器。
优点:
- 明确和干净的方式来标记这些报告需要记录(以及实际应用它)。
缺点:
- 处理从基本类继承的子类更难
Report
。例如,如果在基Report
类中,某些方法(如collect_data()
用 装饰@log_collect_data
),那么对于子类,日志记录将与collect_data()
. 或者,也许,我必须将实际代码从 to 拆分collect_data()
,例如,_collect_data()
在子类中修改它,调用_collect_data()
fromcollect_data()
,然后collect_data()
用@log_collect_data
.
我喜欢第二种方法,但我想要更好的方法来处理子类,而不是使用 _collect_data()。欢迎任何建议!