提问人:Shakil 提问时间:7/14/2016 更新时间:11/18/2023 访问量:5097
禁用 ActionCable 事件的 rails 日志
Disable rails log for ActionCable events
问:
在环境中,rails 记录器记录所有 ActionCable 事件,这有时很烦人(对于我的项目,它时不时地传输消息,日志尾巴像野马一样运行)。禁止ActionCable中所有事件日志的有效方法是什么?另外,如何抑制某些特定的 ActionCable 事件?development
答:
同样在这里,我终于找到了解决方案。 您应该覆盖 /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的日志记录,应将ActionCable配置为使用不执行任何操作的记录器
ActionCable.server.config.logger = Logger.new(nil)
评论
要禁止 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。
虽然这个答案和其他答案让我们对完全打开和关闭日志记录的方法有了一定的了解,但它们并没有完全回答如何从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
谨慎使用:如前所述,其他方法可能会触发日志记录,当您开始更改框架方法时,可能会导致难以解决问题。
评论