如何最大限度地减少监控请求的记录?

发布于 2024-10-27 02:06:25 字数 3024 浏览 5 评论 0原文

我的 Rails 应用程序每分钟都会进行 ping 操作以进行运行状况检查,除非出现错误,否则我希望将这些内容保留在日志之外。我可以通过在 application_controller.rb 中设置记录器来在 Rails 2.3.5 中做到这一点:

def logger
  if params[:__no_logging__] == 'true' && params[:controller] == 'welcome'
       && params[:action] == 'index'
    # ignore monitoring requests
    RAILS_MONITOR_NULL_LOGGER
  else
    RAILS_DEFAULT_LOGGER
  end
end

但这在 Rails 3.0.5 中不起作用

我已经能够通过在中的 Monkeypatching before_dispatch 和 after_dispatch 来组合一个新的解决方案Rails::Rack::Dispatch:

require 'active_support/core_ext/time/conversions'
module Rails
  module Rack
    # Log the request started and flush all loggers after it.
    class Logger
      include ActiveSupport::BufferedLogger::Severity

      def before_dispatch(env)
        request = ActionDispatch::Request.new(env)

        #path = request.filtered_path
        path = request.fullpath

        if request.path == '/' && request.parameters['__no_logging__'] == 'true'
          @log_level = logger.level
            logger.level = Logger::ERROR
            #logger.level = 3
        end

        info 
         "\n\nStarted #{request.request_method} 
             \"#{path}\" " \
             "for #{request.ip} at #{Time.now.to_default_s}"
      end
      def after_dispatch(env)
        logger.level = @log_level unless @log_level.nil?
        ActiveSupport::LogSubscriber.flush_all!
      end
        end
    end
end

我将补丁放入 config/initializers/monkey_patch.rb

这完全按照我的需要工作,我在日志中没有看到此请求:

http://mydomain.com?__no_logging__=true

但所有其他请求仍保留在日志中不受影响

但仍然存在两个问题:

1. 我需要注释掉:

path = request.filtered_path

因为它会导致此错误:

ERROR NoMethodError: undefined method `filtered_path' for #<ActionDispatch::Request:0x105b4c0e8>
/ce_development/Rails/g3/config/initializers/monkey_patches.rb:52:in `before_dispatch'
/ce_development/Rails/g3/.bundle/ruby/1.8/gems/railties-3.0.5/lib/rails/rack/logger.rb:12:in `call'
...

我现在明白这不是问题。我正在使用的 Rails 3.0.5 中不存在有问题的方法“request.filtered_pa​​th”。我无意中从 Rails 3.1.0.beta 复制了我的类,它定义了filtered_pa​​th。 Rails 3.0.5 使用 request.fullpath,如上所示。

2. 我需要注释掉,

logger.level = Logger::ERROR

因为它会导致此错误:

ERROR NameError: uninitialized constant Rails::Rack::Logger::ERROR
/ce_development/Rails/g3/config/initializers/monkey_patches.rb:57:in `before_dispatch'
/ce_development/Rails/g3/.bundle/ruby/1.8/gems/railties-3.0.5/lib/rails/rack/logger.rb:12:in `call'
...

我通过在上面添加这一行解决了第二个问题

include ActiveSupport::BufferedLogger::Severity

我是猴子补丁的新手,我不知道如何获取补丁中定义的filtered_pa​​th或Logger::Error。我尝试过其他要求,但还没有运气。

我还想了解有关在我的项目中使用这个猴子补丁的稳健性的任何建议。有更好的方法吗?

我知道有些人不相信更改日志,但我不希望日志中包含所有这些 ping,除非在请求期间出现错误。

My rails app is pinged every minute for a health check and I want to keep these out of the log unless there is an error. I was able to do this in Rails 2.3.5 by setting the logger with this in application_controller.rb:

def logger
  if params[:__no_logging__] == 'true' && params[:controller] == 'welcome'
       && params[:action] == 'index'
    # ignore monitoring requests
    RAILS_MONITOR_NULL_LOGGER
  else
    RAILS_DEFAULT_LOGGER
  end
end

But this doesn't work in Rails 3.0.5

I've been able to put together a new solution by monkeypatching before_dispatch and after_dispatch in Rails::Rack::Dispatch:

require 'active_support/core_ext/time/conversions'
module Rails
  module Rack
    # Log the request started and flush all loggers after it.
    class Logger
      include ActiveSupport::BufferedLogger::Severity

      def before_dispatch(env)
        request = ActionDispatch::Request.new(env)

        #path = request.filtered_path
        path = request.fullpath

        if request.path == '/' && request.parameters['__no_logging__'] == 'true'
          @log_level = logger.level
            logger.level = Logger::ERROR
            #logger.level = 3
        end

        info 
         "\n\nStarted #{request.request_method} 
             \"#{path}\" " \
             "for #{request.ip} at #{Time.now.to_default_s}"
      end
      def after_dispatch(env)
        logger.level = @log_level unless @log_level.nil?
        ActiveSupport::LogSubscriber.flush_all!
      end
        end
    end
end

I put the patch in config/initializers/monkey_patch.rb

This works exactly as I need, I don't see this request in the log:

http://mydomain.com?__no_logging__=true

But all other request remain in the log unaffected

But there are still two problems:

1. I needed to comment out:

path = request.filtered_path

Because it causes this error:

ERROR NoMethodError: undefined method `filtered_path' for #<ActionDispatch::Request:0x105b4c0e8>
/ce_development/Rails/g3/config/initializers/monkey_patches.rb:52:in `before_dispatch'
/ce_development/Rails/g3/.bundle/ruby/1.8/gems/railties-3.0.5/lib/rails/rack/logger.rb:12:in `call'
...

I now understand this is not a problem. The offending method "request.filtered_path" doesn't exist in Rails 3.0.5, which I am using. I inadvertently copied my class from Rails 3.1.0.beta which does define filtered_path. Rails 3.0.5 uses request.fullpath as now shown above.

2. I needed to comment out

logger.level = Logger::ERROR

Because it causes this error:

ERROR NameError: uninitialized constant Rails::Rack::Logger::ERROR
/ce_development/Rails/g3/config/initializers/monkey_patches.rb:57:in `before_dispatch'
/ce_development/Rails/g3/.bundle/ruby/1.8/gems/railties-3.0.5/lib/rails/rack/logger.rb:12:in `call'
...

I solved this second problem by adding this line above

include ActiveSupport::BufferedLogger::Severity

I'm new to monkey patching and I can't figure out how to get filtered_path or Logger::Error defined in my patch. I've tried other requires, but no luck yet.

I'd also like any advice about the robustness of using this monkey patch on my project. Is there a better way to do this?

I know some people don't believe in altering logs, but I don't want all these pings in the log unless there is an error during its request.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

智商已欠费 2024-11-03 02:06:25

这里描述了 Rails 3 的可能解决方案,其中记录器被自定义记录器取代:根据每个操作静默 Rails 日志,此处:如何在 Ruby on Rails 中基于每个操作禁用日志记录?。我必须将 require 'rails/all' 添加到 custom_logger.rb 类才能使其正常工作。

A possible solution for Rails 3 where the Logger is replaced by a Custom Logger is described here: Silencing the Rails log on a per-action basis and here: How can I disable logging in Ruby on Rails on a per-action basis?. I had to add require 'rails/all' to the custom_logger.rb class to make it work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文