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

时间:2016-09-13 18:21:22

标签: ruby-on-rails ruby logging logstash

我正在向Rails 4应用添加结构化日志记录。使用lograge中描述的logstash-loggerthis article,我的工作大部分都在运作。

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

config.log_tags = [:uuid]

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

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

这是有问题的。它使得如何搜索特定的请求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": "..."
}

2 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。从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

你可以在这里重载任何选项 - 他们将接管lib的选项。

负责此操作的代码是here。显示它有效的测试是here

答案 1 :(得分:0)

古老的问题,但也许会帮助像我这样努力寻找简单方法的人。

使用custom_payload(而不是custom_options),您可以直接访问控制器收到的请求,并获取其ID以将其添加到日志中:

config.lograge.custom_payload do |controller|
  {
    request_id: controller.request.request_id
  }
end

无需为此配置log_tags