自定义Rails记录器创建

时间:2017-07-18 12:05:05

标签: ruby-on-rails ruby logging

我使用Rails 5并需要创建自定义Rails记录器。

例如,在控制器的某些地方,我想要进行此日志记录调用:

{
  "level": "info",
  "ts": 1507972311.8043,
  "caller": "controller/api/v2/news.rb:101",
  "msg": "Event happened",
  "app": "My App",
  "env": "production",
  "context": {
    "event_id": "1234567",
    "email": "example@gmail.com",
    "first_name": "John",
    "last_name": "Doe"
  }
}

后者在我的日志文件中我希望看到这样的内容:

{{1}}

这可能吗?如何同时对所有日志级别(信息/调试/错误)执行此操作?

2 个答案:

答案 0 :(得分:1)

创建自己的包装器:

class LocalLogger

  def self.log(*args)
    new.log(*args)
  end

  def logger
    Rails.logger
  end
  delegate :info, :debug, :warn, :error, to: :logger

  def log(level: :info, payload)
    send(level, payload.inspect)
  end
end

LocalLogger.log level: :warn, {foo: bar}

修改log方法以根据需要进行操作。

然而,避免过于聪明的诱惑 - 默认的记录器行为非常好,并且会像大多数其他开发人员所期望的那样行事。

答案 1 :(得分:0)

最好的解决方案是声明自己的Logger#formatter

Rails.logger.      
      instance_variable_get(:@logger).
      instance_variable_get(:@log).
      formatter = proc do |severity, datetime, progname, msg|
                    DO WHATEVER YOU WANT HERE
                  end