ruby 自定义日志以 json 输出

6 minute read

tldr 日志收集、汇总、分析用上了 elk 全家桶。kibana 需要 json 格式的日志

Gemfile

#Gemfile
gem 'log_formatter' # 自定义日志文件时 json 化输出

构建自定义日志

# app/controllers/concerns/log_concern.rb
# 用来自定义日志输出
require 'log_formatter'
require 'log_formatter/ruby_json_formatter'

module LogConcern
  extend ActiveSupport::Concern

  def log(log_path = nil)
    if log_path
      # 非 controller 调用,需指定文件名
      @log ||= Logger.new(Rails.root.join("log", log_path))
    else
      # controller 调用,默认以 controller 作为文件名
      # 例如 PayNotifyController 日志文件名为 pay_notify.json.log
      log_prefix = self.class.to_s.delete_suffix("Controller").underscore
      @log ||= Logger.new(Rails.root.join("log", "#{log_prefix}.json.log"))
    end

    @log.formatter = Ruby::JSONFormatter::Base.new
    @log
  end
end

写入自定义日志

# controller 调用
class SomeController < ApplicationController
  include LogConcern

  def some_method
    log.error(error: "可以直接以 hash 作为日志内容")
    log.info("也可以是字符串")
  end
end
# 非 controller 调用
module SomeModule
  class << self
    include LogConcern

    def logger
      log("some_module.json.log")
    end

    def some_dummy_client(path, req_params)
    	message = {
        req_path:   path,
        req_params: req_params,
        resp_code:  code.to_i,
        resp_body:  res
      }

      logger.info(message)
    end
  end
end

kibana 效果

kibana