Журнал, который объединяет файлы журнала с трех разных серверов
У нас есть конфигурация с тремя серверами, на каждом из которых работает 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 с открытым исходным кодом).
Затем он будет принимать сообщения журнала с вашего сервера, и вы легко сможете увидеть запросы. (У них даже есть простой скрипт установки!)
Если вы все еще хотите сделать свое первоначальное предложение, то я рекомендую вам использовать сортировку по меткам времени каждую минуту. (При условии, что у вас есть метки времени!)
Во многих кластерных средах вы (дополнительно) отправляете свои сообщения журнала на сервер регистрации с syslog
,
Системный журнал объединит поток сообщений в том порядке, в котором они поступают и в котором они находятся.
Если служба изначально не поддерживает syslog в качестве протокола ведения журнала, вы можете подключиться к logger
программа.
Можете ли вы обойтись чем-то вроде этого в центральной папке, где были собраны файлы, или это слишком тяжело?
cat *.log | sort | less
или же
cat *.log | sort > combined.log
(Использование сортировки, чтобы привести их в порядок в соответствии с отметкой времени)
или, может быть: Хвост несколько удаленных файлов