使用Rails 4和结构化日志记录,如何将请求ID字段添加到日志中?

lee*_*777 10 ruby logging ruby-on-rails logstash

我正在向Rails 4应用程序添加结构化日志记录.使用本文中描述的logragelogstash-logger,我得到了大部分工作.

我在向日志添加请求ID时遇到问题.我发现最接近的是将其添加到config/${ENV}.rb:

config.log_tags = [:uuid]
Run Code Online (Sandbox Code Playgroud)

但是这会将请求ID添加到标记列表,而不是将其添加为命名字段.

{
  "tags": [
    "da76b4be-01ae-4cc4-8d3c-87062ea02cfe"
  ],
  "host": "services",
  "severity": "DEBUG",
  "@version": "1",
  "@timestamp": "2016-09-13T17:24:34.883+00:00",
  "message": "..."
}
Run Code Online (Sandbox Code Playgroud)

这是有问题的.它使得如何搜索特定的请求ID变得更加尴尬和不那么明显.另外,在logstash中解析消息它会覆盖已经与日志消息关联的任何其他标记.

有什么办法可以将请求ID作为命名字段添加到日志中吗?

{
  "request_id", "da76b4be-01ae-4cc4-8d3c-87062ea02cfe",
  "host": "services",
  "severity": "DEBUG",
  "@version": "1",
  "@timestamp": "2016-09-13T17:24:34.883+00:00",
  "message": "..."
}
Run Code Online (Sandbox Code Playgroud)

Ven*_*Ven 0

做这件事有很多种方法。从 Lograge 中,您可以使用custom_options

  # all your lograge stuff...
  config.lograge.enabled = true

  config.lograge.custom_options = lambda do |event|
    # use the `event.payload`
    {uuid: event.payload[:uuid]}
  end
Run Code Online (Sandbox Code Playgroud)

您可以重载此处的任何选项 - 它们将接管库的选项。

负责此操作的代码位于此处。显示其工作原理的测试就在这里