Xpoint
   [напомнить пароль]

Фильтрующий монитор логов

Метки: лог-файл
[арх]
2005-09-28 16:45:38 [обр] Андрей Новиков(42/1242)[досье]

Нужнол написать веб-приложение, которое в браузере позволит в реальном времени мониторить лог. Т.е. юзабельный tail -f | grep. Серверная платформа — Юникс. Логи хранятся в СУБД.

На данный момент у меня сформулировалось два вопроса:

  1. Как в рамках базы осуществить tail? Фильты не помогут, у меня порядка 5,000,000 записей в сутки, значит порядка 60 записей в секунду. Есть поле seq auto_increment. Пока я думаю запоминать где-то последний выбранный seq и играться лимитами. Есть мысли лучше?
  2. Как браузеру взаимодействовать с сервером, через HTTPXmlRequest? Кроме самого слова я ничего не знаю :).

Может кому есть что сказать в общем по этому поводу?

спустя 22 минуты [обр] Давид Мзареулян(31/1003)[досье]
  1. А чем не устраивает order by time desc limit 10?
  2. Эмуляция отправки формы при помощи XMLHttpRequest — например. Хотя тут, возможно, подойдёт и постоянное соединение типа чата.
спустя 15 часов [обр] Андрей Новиков(42/1242)[досье]
Смущает order. Это у меня в день столько записей, а хранится то все за год как минимум.
спустя 2 часа 18 минут [обр] Владимир Палант(80/4445)[досье]
Если order идёт по primary key, то эта операция очень эффективная. Да и с индексом выбрать несколько записей не такая уж проблема, даже в очень больших таблицах.
спустя 1 час 35 минут [обр] Давид Мзареулян(31/1003)[досье]
ОК, добавьте and CURRENT_TIMESTAMP - time < interval '1 hour' (пишу по-постгрессовски). Тогда точно от размера зависеть не будет — если есть индекс по time, то такие выборки делаются мгновенно.
спустя 1 час 14 минут [обр] Алексей Полушин(1/231)[досье]
Про динамическую подгрузку было у Котерова: http://dklab.ru/lib/Subsys_JsHttpRequest/
спустя 13 минут [обр] Владимир Палант(80/4445)[досье]
Если учесть, что IE 7.0 тоже, наконец, будет поддерживать XMLHttpRequest, то эту библиотеку я бы не стал рекомендовать. Тем более, что здесь речь вроде бы об админке, то есть о кросс-браузерности сильно заботиться не нужно.
спустя 1 час 42 минуты [обр] Давид Мзареулян(31/1003)[досье]
Владимир Палант[досье] Ну, нельзя сказать, чтобы активиксность XMLHttpRequest и до этого сильно мешала.
спустя 14 минут [обр] Андрей Новиков(42/1242)[досье]

Давид Мзареулян[досье], с limit 10 мы можем пропустить записи, если за эито время было больше 10. Надо еще start припахать.

По второму вопросу — нужно ли замарачиваться демоном или хватит обычного CGI-скрипта?

спустя 14 минут [обр] Давид Мзареулян(31/1003)[досье]
Всё от задачи зависит, но наиболее тупой алгоритм мне видится таким: браузер время от времени дёргает сервер по xmlhttp и передаёт ему таймстамп последней записи, которая у него есть. Сервер делает select * from log where time > last_timestamp order by time desc и выдаёт это браузеру. Ну, плюс всякие проверки. В этом случае на тормоза напороться, вроде бы, совершенно негде.
спустя 26 минут [обр] Андрей Новиков(42/1242)[досье]
Давид Мзареулян[досье], касательно второго пункта - не понял, как в колбэке получить данные из ответа сервера.
спустя 5 минут [обр] Давид Мзареулян(31/1003)[досье]
Ну, XMLHttpRequest же возвращает в скрипт то, что выдал сервер. Можно в виде DOM-XML-я (responseXML), можно в виде текста (responseText). А дальше — яваскриптом его разбирать и на страничку.
спустя 5 минут [обр] Андрей Новиков(42/1242)[досье]
А можно разжевать? Вот есть вызов callback(request). Что написать в callback, чтобы получить root element и начать с ним работать через DOM?
спустя 6 минут [обр] Владимир Палант(80/4445)[досье]
var request = new XMLHttpRequest();
request.open('GET', 'http://xpoint.ru/');
request.onload = function() {
  alert(this.responseXML);
  alert(this.responseText);
};
request.send(null);
спустя 1 день 17 часов [обр] Сергей Чернышев(39/589)[досье]

У тебя фильтр - он только текущую запись исследует или более сложный?

Может как-нибудь transaction log в filesystem socket писать и его уже слушать и фильтровать по мере поступления?

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

Кстати, я бы не рекомендовал периодический reload при 60 запросах в секунду - лучше заставь браузер постоянно подгружать контент не закрывая соединения (нужно не забыть отключить буфферизацию на сервере).

А какая у тебя база что она 60 запросов в секунду держит и после этого еще позволит тебе из нее выборки делать?

спустя 1 день 23 часа [обр] Андрей Новиков(42/1242)[досье]
mysql. Потом надо будет еще и выборки в прошлом привернуть. Тоже думал о сокетах, но если и так будет работать, то зачем городить два интерфейса?
спустя 32 минуты [обр] Владимир Хоменко(0/67)[досье]
Андрей Новиков[досье]
Может по первому пункту триггеры ввернуть, если версия базы позволяет?
спустя 12 часов [обр] Сергей Чернышев(39/589)[досье]
Андрей Новиков[досье]
Тогда согласен... А зачем тебе вообще браузерный клиент для этого?
спустя 9 часов [обр] Андрей Новиков(42/1242)[досье]
Начальство хочет. Мне грепа хватает. :) Да и будет повод разобраться с HTTPXmlRequest :)
спустя 9 часов [обр] Сергей Чернышев(39/589)[досье]
Ну, тогда да, но сделай так чтобы фильтр всегда нужно было задавать, а то 60 строк в секунду - у тебя системя помрет :)))
спустя 1 час 23 минуты [обр] GRAy(2/259)[досье]
IMHO, такой поток надо анализировать как-то иначе - события какие-нибудь генерить анализатором логов, аналитические инструменты какие-нибудь использовать, хотя бы графически показывать и т.п. Не понимаю как в реальном времени человек на это будет смотреть.
спустя 1 час 9 минут [обр] Давид Мзареулян(31/1003)[досье]
Нет, с такой частотой, конечно, лучше постоянное соединение.
спустя 11 часов [обр] Андрей Новиков(42/1242)[досье]
Я ж не говорю ,что на экран будет всё это сыпаться - смысла никакого нет. Будет фильтроваться, естественно по определенному признаку.
спустя 1 месяц 19 дней [обр] Дионис Сантин aka Человек с Ломом(32/406)[досье]
сообщение промодерировано
Андрей Новиков[досье]
И каково было конечное решение? )
спустя 4 дня [обр] Андрей Новиков(42/1242)[досье]
Пока никакого, это фоновый проект, мало пока времени на него.
Powered by POEM™ Engine Copyright © 2002-2005