【问题标题】:How to get Rails.logger printing to the console/stdout when running rspec?运行 rspec 时如何让 Rails.logger 打印到控制台/标准输出?
【发布时间】:2012-07-31 00:23:43
【问题描述】:

同标题:运行 rspec 时如何让Rails.logger 打印到控制台/标准输出?例如。

Rails.logger.info "I WANT this to go to console/stdout when rspec is running"
puts "Like how the puts function works"

我还是想让Rails.logger 也去log/test.log

【问题讨论】:

    标签: ruby-on-rails logging rspec console stdout


    【解决方案1】:

    对于 Rails 4.x,日志级别的配置与 Rails 3.x 略有不同

    将此添加到config/environment/test.rb

    # Enable stdout logger
    config.logger = Logger.new(STDOUT)
    
    # Set log level
    config.log_level = :ERROR
    

    记录器级别从config.log_level 在记录器实例上设置:https://github.com/rails/rails/blob/v4.2.4/railties/lib/rails/application/bootstrap.rb#L70

    环境变量

    作为奖励,您可以允许使用具有默认值的环境变量覆盖日志级别,如下所示:

    # default :ERROR
    config.log_level = ENV.fetch("LOG_LEVEL", "ERROR")
    

    然后从 shell 运行测试:

    # Log level :INFO (the value is uppercased in bootstrap.rb)
    $ LOG_LEVEL=info rake test
    
    # Log level :ERROR
    $ rake test
    

    【讨论】:

    • 我一直在寻找从环境中快速配置关卡的方法。我看到它可以手动完成,但我认为 Rails 日志框架中没有内置机制可以这样做?
    • 我还发现了这个 gem:github.com/dominicsayers/loglevel 它看起来会创建另一个记录器,所以不确定它是否会干净地集成。
    【解决方案2】:

    对于 Rails 4,请参阅 this answer.

    对于 Rails 3.x,在 config/environments/test.rb 中配置一个记录器:

    config.logger = Logger.new(STDOUT)
    config.logger.level = Logger::ERROR
    

    这会将测试期间记录的所有错误交错到 STDOUT。您可能希望将输出路由到 STDERR 或使用不同的日志级别。

    将这些消息发送到控制台和日志文件需要比 Ruby 内置的 Logger 类更强大的东西。 logging gem 会做你想做的事。将其添加到您的Gemfile,然后在config/environments/test.rb 中设置两个附加程序:

    logger = Logging.logger['test']
    logger.add_appenders(
        Logging.appenders.stdout,
        Logging.appenders.file('example.log')
    )
    logger.level = :info
    config.logger = logger
    

    【讨论】:

    • 对于 rails 4.2.1,我必须在配置中设置日志级别,因为它在记录器实例上的 bootstrap.rb 中被覆盖:github.com/rails/rails/blob/v4.2.4/railties/lib/rails/… 日志级别设置如下: config.log_level = :ERROR
    • @tommes 你能用你添加的确切文件名和代码发布另一个答案吗?我将修改我的答案以指定它适用于 Rails 3.x。
    • 如果您只需要特定测试类的记录器输出,您可以将config.logger = Logger.new(STDOUT) 放入您的setup 方法中。如果您只需要特定测试的记录器输出,请将config.logger = Logger.new(STDOUT) 放在测试的开头。这至少适用于 MiniTest on Rails 5.0.1。
    • 我认为应该使用ActiveSupport::Logger 而不仅仅是Logger。我刚刚中断了生产,因为我希望 Rails.logger 成为具有 ActiveSupport::Logger 接口的对象,并且在开发和测试中它们是......
    • 仔细观察Rails.logger,原来它实际上是一个ActiveSupport::Logger 包裹着ActiveSupport::TaggedLogging.new..
    【解决方案3】:

    将日志添加为background job (&),它将与 rspec 输出交错。

    tail -f log/test.log &
    bundle exec rspec
    

    【讨论】:

    • 这是一个巧妙的解决方案。
    【解决方案4】:

    我喜欢的一个解决方案是执行以下操作,因为它将 rspec 输出与实际的 rails 日志输出分开:

    • 打开第二个终端窗口或选项卡,并对其进行排列,以便您可以看到正在运行 rspec 的主终端以及新终端。
    • 在第二个窗口中运行 tail 命令,以便在测试环境中看到 rails 日志。默认情况下,对于 Window 用户,这可能类似于 $ tail -f $RAILS_APP_DIR/logs/test.logtail -f $RAILS_APP_DIR\logs\test.log
    • 运行您的 rspec 套件

    如果您正在运行像 iTerm 这样的多窗格终端,这会变得更加有趣,并且您可以并排输出 rspectest.log

    【讨论】:

      【解决方案5】:

      您可以在 spec_helper.rb 中定义一个向 Rails.logger.info 和 puts 发送消息并将其用于调试的方法:

      def log_test(message)
          Rails.logger.info(message)
          puts message
      end
      

      【讨论】:

      • 我希望调用 Rails.logger.info 之外的东西,因为我在生产代码中使用 Rails.logger.info、Rails.logger.debug 等。谢谢你的回答。
      • 我明白了。但是为什么这会阻止你在测试中使用 Rails.logger?
      • 我也在测试中使用它。将所有内容都打印到标准输出,而不是使用 tail。
      【解决方案6】:

      我在 rails 5.0 中遇到过类似的问题。我的 api/request 规范没有将错误输出到控制台,而是输出到 log/test.log 文件中。其他测试类型正常输出错误到控制台。

      config.action_dispatch.show_exceptions 更改为false 解决了这个问题:

      # config/environments/test.rb
      config.action_dispatch.show_exceptions = false
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-05
        • 1970-01-01
        相关资源
        最近更新 更多