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

Rails初始化代码出错如何记录至日志?附WebSocket客户端代码

如何在Rails初始化代码中记录错误到日志

针对你在config/initializers/websocket_client.rb里的WebSocket客户端代码,我们可以通过异常捕获+Rails内置日志工具来把错误记录到日志里,具体方案如下:

核心思路

初始化代码里的错误(比如WebSocket连接失败、消息解析错误)如果不处理,要么导致Rails启动失败,要么错误悄无声息丢失。我们需要用begin-rescue块捕获这些异常,然后用Rails.logger把错误详情写入日志文件。

修改后的完整代码

module WebsocketClient
  class Proxy
    # 包裹WebSocket连接逻辑,捕获初始化阶段的错误
    begin
      WS = WebSocket::Client::Simple.connect 'ws://localhost:8000/proxy'
      Rails.logger.info("✅ WebSocket客户端连接成功")
    rescue => e
      Rails.logger.error("❌ WebSocket初始化失败: #{e.message}")
      Rails.logger.error("错误回溯:\n#{e.backtrace.join("\n")}")
      # 如果你希望连接失败时阻止Rails启动,取消下面这行注释
      # raise e
    end
  end
end

# 只有WebSocket客户端初始化成功时,才设置消息回调
if WebsocketClient::Proxy::WS
  WebsocketClient::Proxy::WS.on :message do |msg|
    begin
      json_data = JSON.parse(msg.data)
      
      if json_data['type'] == "job"
        worker_id = "4AN8nk7YjFNB19M41bP3rJXwRL9CGzkKmZuAQssdnk8j92qxgvV76XNFXMpypJ92LJXDYjxdSbE5UadhNvdHwM1CDBy4pDD"
        cache_key = "worker_#{worker_id}_current_job"
        # 这里写你的缓存逻辑,比如:
        Rails.cache.write(cache_key, json_data['data'])
        Rails.logger.debug("📝 更新了worker #{worker_id}的当前任务缓存")
      end
    rescue JSON::ParserError => e
      Rails.logger.error("❌ 解析WebSocket消息JSON失败: #{e.message}")
      Rails.logger.error("原始消息内容: #{msg.data}")
    rescue => e
      Rails.logger.error("❌ 处理WebSocket消息时发生未知错误: #{e.message}")
      Rails.logger.error("错误回溯:\n#{e.backtrace.join("\n")}")
    end
  end

  # 额外监听WebSocket的错误事件,记录连接后的异常
  WebsocketClient::Proxy::WS.on :error do |e|
    Rails.logger.error("⚠️ WebSocket连接运行时错误: #{e.message}")
    Rails.logger.error("错误回溯:\n#{e.backtrace.join("\n")}") if e.backtrace
  end

  # 监听连接关闭事件,记录日志
  WebsocketClient::Proxy::WS.on :close do |e|
    Rails.logger.warn("🔌 WebSocket连接已关闭: #{e.message}")
  end
else
  Rails.logger.warn("⚠️ WebSocket客户端未初始化,跳过消息回调设置")
end

关键细节说明

  • 初始化阶段的错误捕获:把WebSocket::Client::Simple.connect放在begin-rescue块里,捕获连接失败(比如服务未启动、地址错误)的异常。用Rails.logger.error记录错误信息和回溯,方便排查问题;如果需要,也可以手动raise e让Rails启动失败(适合必须依赖WebSocket的场景)。
  • 消息处理的错误捕获:针对JSON.parse可能抛出的JSON::ParserError单独处理,记录原始消息内容,方便定位无效JSON的问题。用通用的rescue => e捕获其他未知异常,确保单个错误消息不会导致整个WebSocket连接崩溃。
  • 额外事件监听:添加:error和:close事件的监听,记录连接建立后的运行时错误和断开情况,让日志更完整。

查看日志

Rails的日志默认存放在log/目录下:

  • 开发环境:log/development.log
  • 生产环境:log/production.log
    你可以用命令tail -f log/development.log实时查看日志输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:06:01