Журнал информации о дублированных запросах в приложении Rails 5 server only - PullRequest
1 голос
/ 28 октября 2019

У меня есть приложение Rails 5.2.3 с Ruby 2.4.5. Я обнаружил странную проблему, что информация о запросе регистрируется дважды в stdout. Вот конфигурация журнала в config / средах / product.rb

  config.logger = ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT))
  config.log_tags = [ lambda {|req| "#{req.cookie_jar["_session_id"]}" }, :remote_ip, :uuid  ]

Предположительно, он будет помечать каждый журнал удаленным ip и запросить uuid, и он делает это для большинства журналов, за исключением странных дополнительныхвойти для запроса. В следующем примере последняя строка представляет собой дублированный журнал для запроса без тега :

[INFO] [2019-10-28 06:11:45 UTC] [127.0.0.1] [f6de1900-a7e5-4486-8b73-7095d0cacb35]  Started GET "/api/v1/nodes?pageSize=20&pageNumber=1" for 127.0.0.1 at 2019-10-28 06:11:45 +0000
[INFO] [2019-10-28 06:11:45 UTC] [127.0.0.1] [f6de1900-a7e5-4486-8b73-7095d0cacb35]  Processing by Api::V1::NodesController#index as XML  
...
...
[INFO] [2019-10-28 06:20:02 UTC] [127.0.0.1] [993e0db4-3995-41ef-851a-bfea1bc25781]  Completed 200 OK in 1084ms (Views: 341.9ms | ActiveRecord: 150.6ms)
127.0.0.1 - - [28/Oct/2019:06:20:02 +0000] "GET /api/v1/nodes?pageSize=20&pageNumber=1 HTTP/1.1" 200 - 1.1347

Я проверил конфигурации, другие настроенные регистраторы не настроены. Следствием этого является то, что на стороне клиента есть таймер для проверки состояния уведомлений каждые 5 секунд. Я добавил глушитель журналов, чтобы избежать регистрации таких запросов:

# config/application.rb
config.middleware.insert_before Rails::Rack::Logger, LogSilencer, silenced: /notification_messages/

# lib/log_silencer.rb
class LogSilencer
  def initialize(app, opts = {})
    @app = app
    @silenced = opts.delete(:silenced)
  end

  def call(env)
    if @silenced.match(env['PATH_INFO'])
      Rails.logger.silence do
        @app.call(env)
      end
    else
      @app.call(env)
    end
  end
end

Это позволяет избежать регистрации в журнале с тегами, но журналы дублированных запросов все еще существуют, тогда стандартный вывод заполнен этим запросом

127.0.0.1 - - [28/Oct/2019:07:04:21 +0000] "GET /api/v1/notification_messages/to_notify HTTP/1.1" 200 - 0.0118
127.0.0.1 - - [28/Oct/2019:07:04:26 +0000] "GET /api/v1/notification_messages/to_notify HTTP/1.1" 200 - 0.0140
127.0.0.1 - - [28/Oct/2019:07:04:31 +0000] "GET /api/v1/notification_messages/to_notify HTTP/1.1" 200 - 0.0137
127.0.0.1 - - [28/Oct/2019:07:04:36 +0000] "GET /api/v1/notification_messages/to_notify HTTP/1.1" 200 - 0.0149
...

Потратил целый день, пытаясь выяснить, кто сгенерировал этот журнал, но никакой подсказки ... Хотел бы попросить помощи о том, как отключить этот журнал, поэтому сделайте данные журнала ясными ...

Спасибо!

1 Ответ

1 голос
/ 30 октября 2019

Кажется, что журналы приходят с веб-сервера, который использовался при запуске приложения Rails. При использовании WEBrick журнал выглядит как

=> Booting WEBrick
=> Rails 5.2.3 application starting in development on http://localhost:4000
=> Run `rails server -h` for more startup options
[2019-10-30 07:01:13] INFO  WEBrick 1.3.1
[2019-10-30 07:01:13] INFO  ruby 2.4.5 (2018-10-18) [x86_64-linux]
[2019-10-30 07:01:13] INFO  WEBrick::HTTPServer#start: pid=5812 port=4000

127.0.0.1 - - [30/Oct/2019:07:01:17 UTC] "GET /test HTTP/1.1" 304 0
- -> /test

При использовании единорога журнал выглядит так:

I, [2019-10-30T07:02:47.626962 #5956]  INFO -- : Refreshing Gem list
I, [2019-10-30T07:02:48.289373 #5956]  INFO -- : listening on addr=0.0.0.0:4000 fd=17
I, [2019-10-30T07:02:48.393598 #5956]  INFO -- : master process ready
I, [2019-10-30T07:02:48.394853 #5965]  INFO -- : worker=0 ready
I, [2019-10-30T07:02:48.399878 #5968]  INFO -- : worker=1 ready

127.0.0.1 - - [30/Oct/2019:07:02:52 +0000] "GET /test HTTP/1.1" 304 - 0.0724

Я могу обнаружить, что формат журнала запросов немного отличается (времяинформация о зоне, затраченное время и т. д.). Я использую Unicorn, его регистратор по умолчанию использует stderr, но кажется, что конфигурация регистратора не работает

  logger Logger.new("#{rails_root}/log/unicorn.log")

, поэтому я должен установить путь stderr

  stderr_path "#{rails_root}/log/unicorn.stderr.log

Тогда журналы запросовв файле unicorn.stderr.log и STDOUT - журналы приложения rails.

Но все равно не знаю, как его отключить, поскольку это своего рода дублированный и бесполезный журнал ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...