如何在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.
相关产品推荐
相关产品推荐

