【问题标题】:Disable Rack::CommonLogger without monkey patching在没有猴子补丁的情况下禁用 Rack::CommonLogger
【发布时间】:2014-04-08 19:04:13
【问题描述】:

所以,我想为我的sinatra 应用程序完全自定义日志记录,但我似乎无法禁用Rack::CommonLogger

根据sinatra docs,我需要做的就是添加以下行(也尝试将其设置为false):

set :logging, nil

我的配置。但是,这不起作用,我仍然在我的终端中收到类似 Apache 的日志消息。所以到目前为止我发现的唯一解决方案就是给这该死的东西打补丁。

module Rack
  class CommonLogger
    def call(env)
      # do nothing
      @app.call(env)
    end
  end
end

如果可以在不恢复此类问题的情况下禁用此功能,有人有任何想法吗?

【问题讨论】:

  • 您在应用中使用Sinatra::Application Sinatra::Base
  • 我使用Sinatra::Base
  • 来自文档"To avoid any logging middleware to be set up, set the logging setting to nil."
  • 我试过了,并将其设置为“假”。没用。
  • 你试试这个disable :logging?

标签: ruby sinatra rack puma


【解决方案1】:

如果您处于开发模式并且尚未设置 --quiet 选项,则将 Puma adds logging middleware 添加到您的应用程序。

要在开发中停止 Puma 登录,请在命令行中传递 -q--quiet 选项:

puma -p 3001 -q

或者如果您使用的是 Puma 配置文件,请将 quiet 添加到其中。

【讨论】:

  • 我正在使用 Webrick,但我仍然在 STDERR 上获取日志。很奇怪。
【解决方案2】:

我猴子修补了 log(env, status, header, started_at) 函数,它被 rack 调用以生成 apache 风格的日志。我们将 jruby 与 logback 一起使用,因此我们不需要使用似乎遍布 ruby​​ 生态系统的所有自定义日志记录。我怀疑 fishwife 正在初始化 CommonLogger,这可以解释为什么我所有尝试禁用它或使用自定义记录器配置它的尝试都失败了。可能 puma 做了类似的事情。实际上,我同时有两个实例。一个使用我的自定义记录器(耶)进行日志记录,另一个仍然在 stderr 上执行其愚蠢的语句。我必须说,我对机架生态系统中的日志记录黑客感到非常震惊。似乎有人需要一个很大的线索。

无论如何,把它放在我们的 config.ru 中对我们有用:

module Rack
  class CommonLogger
    def log(env, status, header, began_at)
      # make rack STFU; our logging middleware takes care of this      
    end
  end
end

除此之外,我还编写了自己的日志中间件,它使用 slf4j 和适当的 MDC,因此我们可以获得更有意义的请求日志记录。

【讨论】:

  • 耶!下班后这是唯一有效的方法!
  • 你不需要那个。只需使用rackup --quiet 启动即可。看我的回答
【解决方案3】:

写入 STDOUT 或 STDERR 的可能不是 Sinatra,而是您的网络服务器。 Puma 可以使用 -q(安静)选项启动,如 @matt 所述。使用 webrick 时,请确保 AccessLog 配置变量是一个空数组,否则它也会记录在您的标准输出中。

Disabling echo from webrick

【讨论】:

    【解决方案4】:

    当您rackup 应用程序时,Rack 默认包含一些中间件。它在this file中定义。

    默认情况下,正如您提到的,日志中间件是启用的。

    要禁用它,只需将选项--quiet 传递给rackup

    rackup --quiet
    

    并且不会启用默认的登录中间件。

    然后,您可以启用自己的日志中间件,而不会被默认记录器(名为 CommonLogger)污染。

    您还可以将#\ --quiet 添加到您的config.ru 文件的顶部,以避免总是输入--quiet,但this behaviour is now deprecated

    【讨论】:

      【解决方案5】:

      这是最佳结果之一。因此,下次我对 sinatra/puma 没有闭嘴感到生气时,这可能更像是给我未来的自己的信息。但要真正实现无声启动:

      class MyApp < Sinatra::Base
        configure do
          set :server, :puma
          set :quiet, true
          set :server_settings, Silent: true
        end
      end
      

      【讨论】:

        猜你喜欢
        • 2015-04-17
        • 2015-03-24
        • 1970-01-01
        • 2016-09-01
        • 2012-09-16
        • 2012-12-18
        • 2020-01-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多