我有一个Rails 5应用程序,可以监听第三方服务中的事件。这个第三方服务不断地将事件流到我的应用程序中,这些事件向我的应用程序发出了几个请求,因此,很多请求日志都与我的应用程序无关。我希望能够完全消除请求日志,只对可以处理的相关事件进行日志记录,但是对于不相关的事件,没有点日志记录。
所以我有一个带有create操作的EventsController。这一行动
class EventsController
before_action :ensure_valid_event, only: :create
def create
...
process_event
...
end
private
def ensure_valid_event
unless Event.exists?(event_name: params[:event])
head :ok
end
end
end不使用宝石做这件事的最好方法是什么?
发布于 2020-01-23 10:38:51
解决这个问题的最简单的方法--我想我们会帮你的忙--是:
)创建操作
若要禁用日志记录,请编辑正确的环境配置文件。例如:config/environments/production.rb并将config.logger行替换为:
config.logger = Logger.new("/dev/null")现在在您的events_controller中,请做:
class EventsController
before_action :enable_logging, only: :create
after_action :disable_logging, only: :create
private
def enable_logging
if valid_event?
Rails.logger = ActiveSupport::Logger.new(STDOUT)
end
end
def disable_logging
Rails.logger = Logger.new("/dev/null")
end
def valid_event?
Event.exists?(name: params[:event])
end
end发布于 2020-01-23 11:24:44
您可以制作一个中间件,它将过滤请求:
class FilterEventsMiddleware
def initialize(app)
@app = app
end
def call(env)
if env['PATH_INFO'] =~ %r{\A/your/events/endpoint_path}
# event name extraction may be different depending on how they are passed
request = ActionDispatch::Request.new env
event_name = request.params[:event]
return [200, {"Content-Type" => "text/plain"}, ['']] unless Event.exists?(name: event_name)
end
@call.call(env)
end
end
config.middleware.insert_before Rails::Rack::Logger, FilterEventsMiddleware这样就没有理由禁用整个应用程序的日志记录,不相关的事件根本不会击中控制器。
https://stackoverflow.com/questions/59876169
复制相似问题