禁用 ActionCable 事件的 rails 日志

Disable rails log for ActionCable events

提问人:Shakil 提问时间:7/14/2016 更新时间:11/18/2023 访问量:5097

问:

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

Ruby-On-Rails 日志记录 Ruby-On-Rails-5 ActionCable

评论


答:

3赞 Taichiro Suzuki 8/24/2016 #1

同样在这里,我终于找到了解决方案。 您应该覆盖 /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赞 Brazhnyk Yuriy 2/18/2017
这无济于事......我搜索了源代码,发现动作电缆有很多使用日志记录的功能......不仅dispatch_action...
17赞 Brazhnyk Yuriy 2/18/2017 #2

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

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

评论

8赞 corpico 7/13/2017
澄清一下,这一行位于 config/environments/development.rb 中
3赞 Arnold Roa 7/10/2022
我还在看: │ │ 启动 GET “/cable?....”对于 1.2.3.4 在 2022-07-10 03:19:09 +0000
0赞 user2553863 6/28/2023 #3

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

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

或者,如果您愿意,可以在初始值设定项中,例如 @Brazhnyk Yuriy 建议:

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

IDK 用于特定的 ActionCable 事件,但如果您尝试抑制敏感数据的日志记录,也许您可以使用filter_parameters:

config.action_cable.filter_parameters = [:password]

最近被这个 PR 添加到了 ActionCable。

0赞 SMAG 11/18/2023 #4

虽然这个答案和其他答案让我们对完全打开和关闭日志记录的方法有了一定的了解,但它们并没有完全回答如何从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

如果我们复制原始方法并在日志记录方法中添加 guard 子句,我们将尽可能地保留原始功能。在这种情况下,请保留从上一个答案中删除的错误处理和相同的日志记录级别(debug 与 info)。

像这样的东西应该可以解决问题:

# /app/channels/application_cable/channel.rb
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:)

# /app/channels/application_cable/channel.rb
def skip_logging_for(action:)
  case Rails.env.to_sym
  when :development
    action.in?(%i[ping custom_action])
  # other env like staging or test could go here
  else
    action.in?(%i[custom_action])
  end
end

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