Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要如何在Python中将日志功能与数据处理分离的建议吗_Python_Logging_Aop - Fatal编程技术网

需要如何在Python中将日志功能与数据处理分离的建议吗

需要如何在Python中将日志功能与数据处理分离的建议吗,python,logging,aop,Python,Logging,Aop,在我的项目中,我有一组类,它们通过调用外部命令来完成一些工作,并返回它们的结果。 让我们称之为“报告” 我想将日志添加到这些报告中,但是,将在运行时定义一个具体的记录器对象,而不是 在定义类时 因此,现在我看到了两种实现日志的变体: I.在运行时,实例化一些ReportLogger类实例,该类实例可以使用给定的具体记录器使用日志功能对所有给定的报告实例进行猴补丁 优点: 可以将日志记录应用于我真正需要的任何子报表类,而不涉及其他类 缺点: 魔法!猴子补丁并不是明确的做事方式 日志记录实际上

在我的项目中,我有一组类,它们通过调用外部命令来完成一些工作,并返回它们的结果。 让我们称之为“报告”

我想将日志添加到这些报告中,但是,将在运行时定义一个具体的记录器对象,而不是 在定义类时

因此,现在我看到了两种实现日志的变体:

I.在运行时,实例化一些
ReportLogger
类实例,该类实例可以使用给定的具体记录器使用日志功能对所有给定的报告实例进行猴补丁

优点:

  • 可以将日志记录应用于我真正需要的任何子报表类,而不涉及其他类
缺点:

  • 魔法!猴子补丁并不是明确的做事方式
  • 日志记录实际上是在运行时应用的,所以在查看报告类代码时,不太清楚是否存在一些日志记录
二,。Singleton
ReportLogger
类,它在创建时通过装饰器包装所有报告,但在运行时接受具体的记录器

优点:

  • 明确而清晰地标记这些报告需要日志记录(以及实际应用日志记录)的方法
缺点:

  • 处理从basic
    Report
    class继承的子类比较困难。例如,如果在base
    Report
    类中,像
    collect\u data()
    这样的方法被
    @log\u collect\u data
    修饰,那么对于子类,日志记录将与
    collect\u data()
    紧密耦合。或者,可能我必须将实际代码从
    收集数据()
    拆分为
    \u收集数据()
    以在子类中修改它,从
    收集数据()
    调用
    \u收集数据()
    ,然后用
    @log\u收集数据
    包装
    收集数据()

我喜欢第二种方法,但我想要更好的方法来处理子类,而不是使用_collect_data()。欢迎任何意见

实际上我对你的第一个选择做了一个初步的版本。请看这里。对于第二个选项,您不能在类实例化时包装它们,而不是在定义时包装它们吗?有点像一个内置的monkeypatch。标准日志模块允许所有子日志记录器都有自己的日志级别、过滤器和输出处理程序,并且一切都可以在运行时完成。有什么原因不适合你吗?