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

У нас есть конфигурация с тремя серверами, на каждом из которых работает nginx, и rails через Mongrel. Каждая установка rails имеет свой собственный набор файлов журналов в своей папке "log", которая является обычной папкой на сервере. Файл журнала, который меня интересует, это <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 беговых рельсов шавок - их 16 на каждом сервере.

3 ответа

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

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

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

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

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

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

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

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

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

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

cat *.log | sort | less

или же

cat *.log | sort > combined.log

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

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

Другие вопросы по тегам