【问题标题】:Managing trace code in ruby在 ruby​​ 中管理跟踪代码
【发布时间】:2010-11-08 06:50:09
【问题描述】:

所以我在开始一个新项目或调试现有项目时使用了大量的跟踪代码/日志记录。我想知道你用什么技术来管理它,因为我总是在提交之前删除它,然后如果出现其他问题就必须重写它。

我在考虑有一个包含所有跟踪代码的开发分支,并且 master 会很干净,但似乎很难筛选出什么是调试代码,什么应该合并。

有什么建议吗?

【问题讨论】:

    标签: ruby debugging logging


    【解决方案1】:

    怎么样

    def debug_only
      if $DEBUG
        yield
      end
    end
    ...
    debug_only { puts "Some tracing code." }
    

    在命令行中传递-d 将使$DEBUG 为真。

    % ruby -e 'p $DEBUG'
    false
    
    % ruby -de  'p $DEBUG'
    true
    

    在这种情况下,一种可能性是将跟踪代码与您正在跟踪的代码分开。

    对于每个示例:

    release.rb:

    class A
      def stuff(a, b)
        # do stuff ...
      end
    end
    

    debug.rb:

    require 'release'
    class A
      alias release_stuff stuff
      def stuff(a, b)
        puts "calling stuff with (#{a.inspect}, #{b.inspect})"
        rv = release_stuff(a,b)
        puts "Done calling stuff."
        rv
      end
    end
    

    这有问题,粒度是一种方法,那么它可能再次鼓励您编写更小的方法。当然,您可以通过一些“元编程”使其不那么冗长。

    您还可以使用 instance_method、bind 和 define_method 使旧方法的副本匿名。

    然后你会使用类似的东西

    ruby -d -rdebug program.rb
    

    【讨论】:

    • 实际上我已经在使用非常相似的东西:def verbose() $verbose = true; yield; ensure $verbose = false end 我有一个 log() 函数,它只在 $verbose 为真时输出。但我的问题在于实际的跟踪代码,它真的很乱,我只是不希望它出现在生产代码中,我希望我的代码没有任何特定于调试的绒毛。
    • 啊哈,没想到这一点——它可能会有所帮助!
    猜你喜欢
    • 2017-12-20
    • 2013-08-14
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多