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

如何在Rails应用中使用Fluent Bit将日志输出到EFK栈?

适配Rails 6.1 + Ruby 2.7/JRuby 9.2的Fluent Bit日志收集基础方案

1. Rails端日志输出配置(无额外gem依赖)

首先将Rails日志输出为标准JSON格式,降低Fluent Bit解析成本,同时兼容CRuby和JRuby环境:

# config/environments/production.rb
Rails.application.configure do
  # 省略原有生产环境配置
  config.log_formatter = proc do |severity, timestamp, progname, msg|
    log_payload = {
      severity: severity,
      log_time: timestamp.iso8601,
      app_name: "your-rails-service",
      env: Rails.env,
      message: msg.to_s.force_encoding("UTF-8").scrub # 兼容JRuby编码避免乱码
    }
    # 注入请求上下文字段(可选,按需扩展)
    if Thread.current[:current_request].present?
      log_payload.merge!({
        request_id: Thread.current[:current_request].request_id,
        http_method: Thread.current[:current_request].request_method,
        http_path: Thread.current[:current_request].fullpath,
        http_status: Thread.current[:current_request].response.status rescue 0
      })
    end
    "#{log_payload.to_json}\n"
  end

  # 可选:将请求对象存入线程变量用于日志注入,配合中间件实现
  config.middleware.insert_after ActionDispatch::RequestId, lambda { |app|
    lambda { |env|
      request = ActionDispatch::Request.new(env)
      Thread.current[:current_request] = request
      app.call(env)
    ensure
      Thread.current[:current_request] = nil
    end
  }
end

2. Fluent Bit核心配置

Fluent Bit为独立进程,与Ruby运行时无耦合,可部署在与Rails同节点或独立日志集群,以下是最小可用配置:

# fluent-bit.conf
[SERVICE]
    Flush          1
    Log_Level      warn
    Parsers_File   /etc/fluent-bit/parsers.conf

# 输入模块:直接tail Rails生产日志文件
[INPUT]
    Name           tail
    Path           /opt/your_rails_app/log/production.log
    Parser         json
    Tag            rails.app.*
    Mem_Buf_Limit  10MB
    Skip_Long_Lines On
    Read_from_Head Off

# 过滤模块:补充元字段、标准化时间戳
[FILTER]
    Name           modify
    Match          rails.app.*
    Add            host ${HOSTNAME}
    Add            app your-rails-service

[FILTER]
    Name           date
    Match          rails.app.*
    Key            log_time
    Format         %Y-%m-%dT%H:%M:%S.%L%z
    Storage_Key    @timestamp

# 输出模块:上报到Elasticsearch
[OUTPUT]
    Name           es
    Match          rails.app.*
    Host           your-es-instance-host
    Port           9200
    Index          rails-service-logs-%Y.%m.%d
    Logstash_Format Off
    Retry_Limit    3
    # 若ES开启认证则补充以下配置
    # HTTP_User    your-es-user
    # HTTP_Passwd  your-es-password

3. 环境兼容性说明

  • Ruby 2.7.x 全版本兼容,无需额外适配
  • JRuby 9.2.20.0 仅需确保日志输出内容做了UTF-8编码处理,上述配置中force_encoding('UTF-8').scrub已经覆盖该场景
  • 整体方案无需引入任何Ruby gem,对Rails应用性能损耗可忽略

4. 可选优化点

  • 若需要收集Rails异常栈日志,可在Fluent Bit中新增multiline parser规则匹配异常行,合并为单条日志上报
  • 高并发场景下可将Rails日志输出到本地UDP端口,Fluent Bit用UDP输入模块接收,进一步降低磁盘IO开销
  • 可新增Fluent Bit的rewrite_tag过滤器按日志等级拆分索引,方便错误日志快速检索

内容的提问来源于stack exchange,提问作者F.M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:36:02