Решил тут сделать для нашего портала shgpi.edu.ru нормальную статистику. Давно, в принципе, пора было, но руки не доходили.
Определил исходные требования:
1. Возможность получения информации в режиме реального времени
2. Возможность быстро формировать статистику по разным, пока неизвестным, параметрам
3. Независимость от ограничений формата журнала Apache2 или других приложений
По заявленным параметрам сразу отпадают все существующие анализаторы журналов. Обрабатывать файлы журналов какими-то своими методами противоречит пп.1 и 2. Единственный выход - сразу заставить Apache сохранять журнал в базе данных. Поиски в Сети дали mod_log_sql, который на заявленные параметры тоже не подходил, а именно - по пункту 3.
Выход, тем не менее, нашелся. Оказывается apache2 умеет журналировать через конвеер (http://httpd.apache.org/docs/2.0/mod/mod_log_config.html#customlog). То есть, на стандартный вход заявленной программы он посылает журнал строка за строкой в заданном формате, а уж что дальше будет делать с журналом программа - проблемы самой программы. После загрузки веб-сервер стартует такую программу, перед окончанием работы - уничтожает. Получается, достаточно создать программу, которая при старте соединяется с сервером БД, держит это соединение, приходящие на стандартный вход строки журнала конвертирует по заданным требованиями и сохраняет в базу.
Среди замеченных проблем - безусловное завершение работы программы веб-сервером по окончанию его работы, что может привести к недозаписи одной или нескольких строк в базу данных. Т.к. все это мне нужно только для статистики, которая, как известно, наука неточная, то решил оставить данную проблему как есть, особенно с учетом того, что веб-сервер перестартую дай Бог раз в месяц, а то и реже. Еще одна проблема - головной процесс апача запускается под рутом, следовательно и программу он запускает под рутом. Значит писать ее надо очень аккуратно.
Сделал, проверил, работает. За 5 дней накидало в базу ... щас посмотрю ... 74703 коннекта
Теперь, как это все было сделано.
Продолжение следует...