在
development
环境中,rails logger 会记录所有 ActionCable 事件,这有时很烦人(对于我的项目,它时不时地传输消息,并且日志尾部像野马一样运行)。抑制 ActionCable 的所有事件日志的有效方法是什么?另外,如何抑制某些特定的 ActionCable 事件?
要完全禁用 ActionCable 的日志记录,您应该将 ActionCable 配置为使用不执行任何操作的记录器
ActionCable.server.config.logger = Logger.new(nil)
同样在这里,我终于找到了解决方案。 您应该覆盖 /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)
行来模拟原始行为。
谢谢。
要抑制来自 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。
虽然这个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
谨慎使用:正如其他人提到的,其他方法可能会触发日志记录,当您开始更改框架方法时,可能会导致难以解决问题。