LINUX.ORG.RU

Функции анализатора логов


0

1

На диплом дали тему «Анализатор журнала доступа прокси-сервера Squid». В тему входит разработка web-интерфейса и чтение лога в базу «в режиме реального времени» (с применением AJAX). Написал демон, который мониторит лог и пишет изменения в базу. Начал писать web-интерфейс и понял, что не смогу спроектировать полноценный интерфейс пока не пойму какой функционал требуется от анализатора логов. Админы, подскажите что должно быть в интерфейсе анализатора логов, какие функционал от него требуется?

P.S.: Если кому-то нужно, ссылки на исходники (github):

какой функционал требуется от анализатора логов

Линейный и ограниченный в гильбертовом пространстве, тогда он представляется как скалярное произведение элемента.

aedeph_ ★★
()

Смотри http://www.nltechno.com/awstats/awstats.pl?config=destailleur.fr

Твой демон, кстати, полная какашка. И в плане реализации, и в плане идеи. Если в твоем ВУЗе защита диплома это не просто формальность перед получением корочки, то надо все переделывать.

bool LogReader::InBaseReader::isAlreadyInBase(const std::string line) const
{
    QueryResult res;
    LogReader::StringList lecs = LogReader::split(" ", line, false); //lecsems - it's result of spliting string by separator
    std::string query = boost::str(boost::format("SELECT id FROM squid_access_log WHERE time=%d AND duration=%d AND client_address='%s' AND result_codes='%s' AND bytes=%d AND request_method='%s' AND url='%s' AND rfc931='%s' AND hierarchy_code='%s' AND type='%s'") % lecs.at(0) % lecs.at(1) % lecs.at(2) % lecs.at(3) % lecs.at(4) % lecs.at(5) % lecs.at(6) % lecs.at(7) % lecs.at(8) % lecs.at(9));
    try{
        res = db->query(query.c_str());
    }
    catch(DatabaseError &e) {
        std::cout << e.what() << std::endl;
    }
    if(res.empty()) {
        return false;
    }else {
        return true;
    }
}

ОМГ

anonymous
()

какие функционал от него требуется

Возможность сделать выборки по дате, логину, ip-адресу, куда лезли. Желательно, чтобы можно было комбинировать. Можно еще картинки а-ля mrtg прикрутить.

cipher ★★★★★
()
Ответ на: комментарий от anonymous

Не ВУЗ - колледж. За ссылку, спасибо. Подскажите годную, на ваш взгляд, архитектуру. Что нужно исправлять в реализации? Что в вышеприведенном листинге вас смущает?

headbang
() автор топика
Ответ на: комментарий от headbang

Сразу бросается в глаза lecseme, прямой доступ к бд (наверняка есть приличные обертки с orm и прочими плюшками), топорная обработка ошибки, классический лишний if: это же not.

// другой анонимус, в сортах плюсов не разбираюсь

anonymous
()
Ответ на: комментарий от headbang

чтение лога в базу «в режиме реального времени» (с применением AJAX)

Лолшто?

Что в вышеприведенном листинге вас смущает?

В твоем коде есть возможность для SQL-инъекции. Надо эскейпить строки при работе с БД. Писать комментарии на неграмотном английском - плохой тон. Особенно, если ни в самом комментарии, ни в использовании английского языка смысла нет. Еще не нужно проверять таким способом наличие строк из лога в БД. Если лог большой, то при рестарте твоего демона, ему потребуется очень много времени, чтобы найти первую новую строку.

Я тоже не знаю плюсы, но ИМХО код должен быть хотя бы таким (если игнорировать общую бредовость идеи):

bool LogReader::InBaseReader::isAlreadyInBase(const std::string line) const
{    
    std::string sql_template = "SELECT id FROM squid_access_log WHERE time=%d AND duration=%d AND client_address='%s' AND result_codes='%s' AND bytes=%d AND request_method='%s' AND url='%s' AND rfc931='%s' AND hierarchy_code='%s' AND type='%s' LIMIT 1";
    LogReader::StringList segments = LogReader::split(" ", db->escape(line), false);
    std::string query = boost::str(boost::format(sql_template) % segments.at(0) % segments.at(1) % segments.at(2) % segments.at(3) % segments.at(4) % segments.at(5) % segments.at(6) % segments.at(7) % segments.at(8) % segments.at(9));
    try {
        return !db->query(query.c_str()).empty();
    } catch (DatabaseError &e) {
        std::cout << e.what() << std::endl;
        return false;
    }
}

Я с подобными задачами не сталкивался. Наверное те, кто ими занимался может подсказать тебе лучше, но я бы посоветовал вот что. Если нужно разработать решение, которое будет хорошо работать в боевых условиях, то производительности реляционных БД очень скоро начнет не хватать. Если есть возможность, лучше использовать какой-нибудь NoSQL. Хотя для дипломной работы это возможно не критично, и мускул вполне сойдет.

Необходимости писать что-то на C++ и вообще делать демон, отслеживающий изменения файла, думаю нету, т.к. актуальность данных вплоть до секунды в этой области никого не интересует. Лаг даже в одну минуту будет вполне себе реалтаймом. По этому не вижу смысла извращаться и советую просто написать скрипт на питоне, который раз в минуту будет добавлять в базу новые записи из лога. Нахождение первой новой (не записанной в БД) строки делай не так как у тебя сейчас, а запоминай позицию, на которой ты в прошлый раз окончил чтение, и дальше продолжай с нее.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.