【问题标题】:With Rails 4 and structured logging, how can I add the request id field to logs?使用 Rails 4 和结构化日志记录,如何将请求 id 字段添加到日志中?
【发布时间】:2017-01-21 10:40:57
【问题描述】:

我正在向 Rails 4 应用程序添加结构化日志记录。使用logragelogstash-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": "..."
}

【问题讨论】:

    标签: ruby-on-rails ruby logging logstash


    【解决方案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

    【讨论】:

    • 我试过了,但是payload 哈希没有 uuid 字段。我的日志中只有"uuid": null
    • 我发现您需要在ApplicationController 中定义append_info_to_payload 才能使其工作(请参阅github.com/roidrage/lograge/blob/master/README.md)。但这只会将自定义字段添加到访问日志中。为了使 UUID 有用,它需要在与该请求关联的所有日志中(就像 Rails 将标签放在每个日志条目上一样)。
    【解决方案2】:

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

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

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

    无需配置log_tags 即可使用。

    【讨论】:

    • 这行得通!谢谢
    猜你喜欢
    • 2023-03-23
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 2018-12-18
    相关资源
    最近更新 更多