【问题标题】:Custom Rails logger creation自定义 Rails 记录器创建
【发布时间】:2017-12-23 07:02:59
【问题描述】:

我正在使用 Rails 5,需要创建一个自定义 Rails 记录器。

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

Rails.logger.info('Event happened',
  { event_id: '...', email: '...', ...}
)

在我的日志文件中,我希望看到类似这样的内容:

{
  "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"
  }
}

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

【问题讨论】:

  • 你可以使用这样的东西。 logger.debug {"人物属性哈希:#{@person.attributes.inspect}"}

标签: ruby-on-rails ruby logging


【解决方案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 方法以按照您的意愿行事。

但是,请避免对此过于聪明 - 默认记录器行为非常好,并且会像大多数其他开发人员所期望的那样运行。

【讨论】:

  • 对我不起作用:` 语法错误,意外 tIDENTIFIER (SyntaxError) def log(level: :info, payload)`
  • 检查你的 Ruby 版本。该语法不适用于旧版本的 Ruby。如果是这种情况,请尝试def log(level, payload),然后使用LocalLogger.log :warn, {foo: :bar}
  • ruby -v => ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
【解决方案2】:

最好的解决方案是声明你自己的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

【讨论】:

  • 如果 Rails.logger 更改其实现,这不会中断吗?
  • @Kris 它显然会。依赖 Rails 意味着当 Rails 更改其实现时,一切都可能中断。甚至Rails.logger 也可能不复存在。
  • 如果您使用他们的公共 API,它不会在同一个主要版本中中断。这就是为什么我会使用 SimpleDelegator 包装 Rails.logger。
猜你喜欢
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 2022-10-15
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
相关资源
最近更新 更多