С Rails 4 и структурированным протоколированием, как я могу добавить поле идентификатора запроса в журналы?

Я добавляю структурированное ведение журнала в приложение Rails 4. Используя lograge и logstash-logger, как описано в this статья, в основном я работаю.

У меня возникли проблемы с добавлением идентификатора запроса в журналы. Самое близкое, что я нашел, это добавить это к config/${ENV}.rb:

config.log_tags = [:uuid]

Но это добавляет идентификатор запроса в список тегов вместо добавления его в качестве именованного поля.

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

Это проблематично. Это делает его более неудобным и менее очевидным в том, как искать конкретный идентификатор запроса. Кроме того, синтаксический анализ сообщения в логсташе перезаписывает любые другие теги, которые уже связаны с сообщением журнала.

Есть ли способ добавить идентификатор запроса в журнал как именованное поле?

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

Ответ 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.

Код, отвечающий за это, здесь. Тест, который показывает, что он работает, здесь.