You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby/Rails中Python sys.addAuditHook等效实现及Socket日志方案

Ruby中少改代码记录Socket操作的方案

Ruby没有像Python sys.addAuditHook 那样专门的内置审计钩子,但有两种实用方案可以帮你在几乎不修改业务代码的前提下,记录所有Socket操作:

1. 使用TracePoint API全局追踪方法调用

TracePoint是Ruby内置的事件追踪工具,可以捕获方法调用、对象创建等底层事件,无需修改原类的代码。你可以通过它过滤Socket相关的关键方法调用,记录事件详情。

示例代码:

require 'socket'

# 初始化TracePoint,监听方法调用事件
trace = TracePoint.new(:call) do |tp|
  # 精准过滤需要追踪的Socket相关方法
  target_methods = {
    TCPServer => [:open],
    Socket => [:accept],
    BasicSocket => [:puts, :close] # client是BasicSocket的子类,监听这里覆盖实例操作
  }

  if target_methods.any? { |klass, methods| tp.defined_class <= klass && methods.include?(tp.method_id) }
    caller_info = tp.binding.caller_locations(1, 1)[0].to_s
    puts "[Socket Audit] #{tp.defined_class}##{tp.method_id} | Args: #{tp.args.inspect} | Caller: #{caller_info}"
  end
end

# 启动追踪
trace.enable

# 你的原业务代码,完全不需要修改
server = TCPServer.open(2017)
loop {
  client = server.accept
  client.puts "hello world"
  client.close
}

# 停止追踪(按需使用)
trace.disable

这个方案无需修改任何Socket类的实现,通过全局事件监听完成审计;缺点是全局追踪会有轻微性能损耗,需要精准过滤目标方法避免冗余日志。

2. 猴子补丁(Monkey Patch)关键Socket类

通过重写Socket相关类的目标方法,在方法执行前后添加日志逻辑,这种方式性能更好,日志更精准,而且同样不需要修改业务代码,只需要在程序启动时加载补丁即可。

示例代码:

require 'socket'

# 给TCPServer类的open方法添加日志
class TCPServer
  class << self
    alias_method :original_open, :open
    def open(*args)
      puts "[Socket Audit] TCPServer.open | Args: #{args.inspect}"
      original_open(*args)
    end
  end
end

# 给Socket类添加accept、puts、close方法的日志
class Socket
  alias_method :original_accept, :accept
  def accept
    puts "[Socket Audit] Socket#accept"
    original_accept
  end

  alias_method :original_puts, :puts
  def puts(*args)
    puts "[Socket Audit] Socket#puts | Data: #{args.inspect}"
    original_puts(*args)
  end

  alias_method :original_close, :close
  def close
    puts "[Socket Audit] Socket#close"
    original_close
  end
end

# 原业务代码保持不变
server = TCPServer.open(2017)
loop {
  client = server.accept
  client.puts "hello world"
  client.close
}

这个方案性能开销小,日志逻辑直接绑定到目标方法,不会捕获无关事件;需要注意的是,如果其他第三方库也修改了这些Socket方法,可能会出现冲突,适合作为长期的审计方案。

两种方案都能满足你“少改代码、记录底层Socket操作”的需求,临时调试用TracePoint更灵活,长期审计用猴子补丁更稳定。

内容的提问来源于stack exchange,提问作者ebdavis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:17:24