Назад | Перейти на главную страницу

Журнал, который объединяет файлы журналов с трех разных серверов.

У нас есть конфигурация с тремя серверами, на каждом из которых работает nginx, и рельсы через Mongrel. Каждая установка rails имеет свой собственный набор файлов журнала в своей собственной папке журнала, которая представляет собой обычную папку на сервере. Интересующий меня файл журнала <RAILS APP>/log/production.log

Любой запрос, попадающий на сайт, отправляется случайным образом на любой из трех серверов, поэтому ведение журнала может быть в любом из трех журналов: фактически каждый файл журнала имеет вывод журнала для трети запросов на сайте.

Иногда мне нужно просмотреть журнал для конкретного запроса, чтобы увидеть, как он был обработан, и мне всегда нужно, чтобы все три открывались быстрее, и искать свой запрос, что немного похоже на лаваш. Было бы намного лучше иметь один файл журнала, который объединяет все три.

Теперь вы, вероятно, думаете: «Поместите их все в общую папку и получите только один файл журнала». Но мы не хотим этого делать из опасения снижения эффективности: мы действительно используем общую папку tmp для некоторых вещей, но она немного медленная, и мы не хотим, чтобы все журналы проходили через http (что вот что случилось бы, если бы мы использовали общую папку). Так что это не вариант.

Есть другие предложения? Я думаю о задаче cron, которая запускается, например, раз в минуту, копирует журналы с серверов 1, 2 и 3 в одно и то же место и УМНЫМ СПОСОБОМ их объединяет, чтобы порядок строк в журнале был таким же как если бы все три сервера записали в один и тот же журнал.

спасибо Макс

РЕДАКТИРОВАТЬ - пример вывода файла журнала выглядит так:

Feb 06 13:15:31 ec2-rails rails[21419]: ESC[4;36;1mUser Update (3.3ms)ESC[0m   ESC[0;1mUPDATE `users` SET `custom_signup_fields` = NULL, `all_license_sku_ids` = '--- \n- 1\n',
 `rank_criteria` = '--- \n:has_attached_a_doc_to_a_lesson?: false\n:has_downloaded_a_premade_lesson?: false\n:has_logged_into_lesson_viewer?: false\n:has_downloaded_a_custom_l
esson?: false\n:has_logged_in?: true\n:has_created_pupil_access?: false\n:has_created_a_lesson?: false\n:has_favorited_a_lesson?: false\n:has_viewed_pupil_usage_data?: false\n
:has_viewed_a_lesson?: true\n', `preferences` = '--- \n/: \n current-scheme-step: 5931\n current_product_id: 21\n' WHERE `id` = 52331ESC[0m
Feb 06 13:15:31 ec2-rails rails[21779]: ESC[4;36;1mInstrumentFamily Load (2.6ms)ESC[0m   ESC[0;1mSELECT `instrument_families`.id FROM `instrument_families` INNER JOIN users_in
strument_families ON instrument_families.id = users_instrument_families.instrument_family_id WHERE ((`users_instrument_families`.user_id = 51668)) ESC[0m
Feb 06 13:15:31 ec2-rails rails[21419]: ferret_create/update: User : 52331
Feb 06 13:15:31 ec2-rails rails[21419]: creating doc for class: User, id: 52331

Здесь стоит обратить внимание на число в квадратных скобках - это pid рельсов mongrel running rails - их 16 на каждом сервере.

Хотя я понимаю, что вы ищете быстрый способ получить 3 файла журнала ... "слиться" в каком-то смысле, вам может быть лучше просто настроить себя с помощью сервера журналов и делать более интересные вещи с вашими журналами. Как вы заявили, вы хотели проверять все в журнале, нет проблем с центральным сервером журналов.

Журналы также могут отслеживать состояние вашего сервера.

Я использую Graylog2, он изящный, простой в использовании и действительно эффективный для поиска (Graylog2 - бесплатная альтернатива Splunk с открытым исходным кодом).

  1. https://www.graylog.org/download/

Затем он будет принимать запросы журнала с вашего сервера, и вы легко увидите запросы. (У них даже есть простой сценарий установки!)

При условии, что вы все еще хотите сделать свое первоначальное предложение, я рекомендую вам использовать сортировку по отметкам времени каждую минуту. (При условии, что у вас есть временные метки!)

Во многих кластерных средах вы (дополнительно) отправляете свои сообщения журнала на сервер регистрации с syslog.

Системный журнал объединит поток сообщений в порядке их поступления и готовности.

Если служба не поддерживает syslog изначально в качестве протокола ведения журнала, вы можете подключиться к logger программа.

Можете ли вы обойтись чем-то подобным в центральной папке, где собраны файлы, или это слишком тяжело?

cat *.log | sort | less

или

cat *.log | sort > combined.log

(Используя сортировку, чтобы упорядочить их по метке времени)

или, может быть: Отслеживайте несколько удаленных файлов