禁用 ActionCable 事件的 Rails 日志

问题描述 投票:0回答:4

development
环境中,rails logger 会记录所有 ActionCable 事件,这有时很烦人(对于我的项目,它时不时地传输消息,并且日志尾部像野马一样运行)。抑制 ActionCable 的所有事件日志的有效方法是什么?另外,如何抑制某些特定的 ActionCable 事件?

ruby-on-rails logging ruby-on-rails-5 actioncable
4个回答
17
投票

要完全禁用 ActionCable 的日志记录,您应该将 ActionCable 配置为使用不执行任何操作的记录器

ActionCable.server.config.logger = Logger.new(nil)

3
投票

同样在这里,我终于找到了解决方案。 您应该覆盖 /app/channels/application_cable/channel.rb 中的代码,如下所示

module ApplicationCable

  class Channel < ActionCable::Channel::Base

    def dispatch_action(action, data)

      #logger.info action_signature(action, data)

      if method(action).arity == 1
        public_send action, data
      else
        public_send action
      end
    end
  end
end

您可以通过取消注释

#logger.info action_signature(action, data)
行来模拟原始行为。

谢谢。


0
投票

要抑制来自 ActionCable 的所有事件日志,您可以放入所需环境的配置文件(例如 config/environments/development.rb):

config.action_cable.logger = Logger.new(nil)

或者,如果您愿意,可以在初始化器中,如@Brazhnyk Yuriy 建议:

ActionCable.server.config.logger = Logger.new(nil)

针对特定 ActionCable 事件的 IDK,但如果您尝试禁止记录敏感数据,也许您可以使用 filter_parameters:

config.action_cable.filter_parameters = [:password]

最近已通过 此 PR 添加到 ActionCable。


0
投票

虽然这个Answer和其他人让我们深入了解了完全打开和关闭日志记录的方法,但他们并没有完全回答如何从OP的问题中排除某些操作或仅在某些环境中排除某些操作的问题。

让我们从查看源方法开始,我们将重写:

def dispatch_action(action, data)
  logger.debug action_signature(action, data)

  if method(action).arity == 1
    public_send action, data
  else
    public_send action
  end
rescue Exception => exception
  rescue_with_handler(exception) || raise
end

如果我们复制原始方法并向日志记录方法添加一个保护子句,我们将尽可能保留原始功能。在这种情况下,保持从之前的答案中删除的错误处理和相同的日志记录级别(调试与信息)。

这样的事情应该可以解决问题:

def dispatch_action(action, data)
  logger.debug action_signature(action, data) unless skip_logging_for(action:)

  if method(action).arity == 1
    public_send action, data
  else
    public_send action
  end
rescue Exception => exception
  rescue_with_handler(exception) || raise
end

在这里我们可以使

skip_logging_for(action:)
方法的逻辑成为我们所需要的:

def skip_logging_for(action:)
  case Rails.env.to_sym
  when :development
    action.in?(%i[ping custom_action])
  else
    action.in?(%i[custom_action])
  end
end

谨慎使用:正如其他人提到的,其他方法可能会触发日志记录,当您开始更改框架方法时,可能会导致难以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.