在不改变Python和Ruby代码的情况下进行日志记录

时间:2014-03-28 20:56:01

标签: python ruby

我在Ruby和Python上都做了很多工作。我对常用的调试器非常熟悉,但我仍然发现自己仍在代码中输入 puts print 语句。 为什么?因为我想检查变量而不必停止并启动代码。这对于长序列代码(例如后台处理)尤为重要。

问题当然是代码随后被这些语句所占据。有时候我需要添加一个注释,或者解压缩一个数组以获得一些额外的逻辑。在代码投入生产并且发现新问题后,我可能需要将print / puts放回去。最好能够将它们存储在实际程序代码的外部。

是否有任何工具允许在代码中的特定点创建变量日志记录,以及为打印演示文稿运行短代码段的能力?

3 个答案:

答案 0 :(得分:3)

使用git之类的版本控制系统,您可以从logging分支创建master分支,其中包含日志记录语句。

这样,您就拥有了一个干净的(主)版本和一个日志版本。

随着提交添加到master,您可以使用rebase更新日志记录分支:

git checkout logging
git rebase --interactive master

答案 1 :(得分:1)

通常存在不同的问题(=程序的不同方面),例如业务逻辑,持久性或日志记录纠缠在同一代码中。 Aspect- oriented - programming(AOP)通过将这些问题分成不同的模块来解决这个问题。 一个针对ruby的AOP框架是aquarium,也有AOP libraries for python,但最着名的AOP库是AspectJ(对于Java)。

在不改变实际源代码的情况下记录变量是 AOP的着名示例。 aquarium page上的第一个示例处理您的用例。该示例记录以Service结尾的类的每个方法调用(及其参数),而不更改-Service类本身:

class ServiceTracer
  include Aquarium::DSL
  # jp => the current "join point"
  before :calls_to => :all_methods, :in_types => /Service$/ do |jp, object, *args|
    names = "#{jp.target_type.name}##{jp.method_name}"
    log "Entering: #{names}: object = #{object}, args = #{args}" 
  end
end

当然有更多进步方法选择(比​​'给我每个以Service结尾的类的方法调用')是可能的。

答案 2 :(得分:1)

的Python: 也许你可以编写一个满足你的一些要求的日志装饰器。你可以通过googling" logging decorator python"找到python日志装饰器的例子。