Анализатор логов PHP-на-Apache

    Решил написать об одной полезной утилите, которую написал в августе и уже два месяца успешно использую.
    Утилита сводит к минимуму усилия по слежению за логами ошибок PHP.

    Проблема: Лог ошибок — это файл с кучей строк, из которых большинство повторяются. Поэтому вручную их никто не читает, пока не возникнут какие-то жесткие проблемы. Это неправильно. Логи ошибок на то и существуют, чтобы их регулярно просматривать, а ошибки — устранять.

    Решение: Jenkins. Что умеет эта утилита?
    • находить в логе Apache сообщения о ошибках PHP;
    • группировать сообщения об одной и той же ошибке;
    • подсчитывать количество повторений каждой ошибки и время последнего обнаружения;
    • формировать HTML-отчет по пачке логов;
    • отправлять результат выполнения на почту;
    • самостоятельно ротировать логи.


    Пример простейшего использования — повесить на крон:
    05 00 * * * www ~/scripts/jenkins.php -mme@coldflame.in.ua -r/var/log/apache2/*.error.log
    

    Утилита будет запускаться в пять минут после полуночи, собирать все логи по указанной маске (из расчета, что на каждую площадку отдельный лог-файл), и отсылать результат на указанный e-mail, после чего ротировать логи. Очень удобно. Кусок письма с результатом:
    Jenkins report for somesite.com-error.log

    Total lines in log: 1750525
    Lines recognized as PHP errors: 1748006
    Unique PHP error messages: 40

    Error messages
    Notice: blah-blah-blah [/home/user/file.php:380] (1234 times, last seen on 24.08.08 00:36)
    Notice: foobar [/home/user/other-file.php:123] (14 times, last seen on 24.08.08 12:34)
    … etc


    Еще один вариант использования — для анализа накопившегося гигабайтного лога, с которым вроде бы ничего уже не сделаешь. Но как правило на посещаемых площадках повторений ошибок больше, чем самих ошибок — поэтому если их сгруппировать, получается вполне исправляемый отчет.

    Скачать. Предложения и пожелания можете слать мне любым удобным способом.
    Поделиться публикацией
    Похожие публикации
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 22
    • 0
      Лирой? :)
    • 0
      Сразу что бросается в глаза: нет возможности мылить через smtp сервер (команда mail сейчас уже почти ни где не используется ибо «спам» достал всех).
      • 0
        а настроить sendmail через php.ini? :)
        • 0
          а добраться до php.ini на VDS?
          проще поставить флаг: sendmail=true — юзаем сендмейл, sendmail=false — юзаем стандартный mail.
          • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              вот мне в .htaccess только этой гадости не хватало…
              при его объёме, рисовать туда еще и пхп настройки, да к тому же ради одного единственного скрипта… не жирно ли будет?
              лом дописать, так и скажите, и не надо выкручиваться настройками через другие средства, кроме самого скрипта
              • НЛО прилетело и опубликовало эту надпись здесь
      • –2
        PHP можно заставить писать ошибки в отдельный файл, который не будеть гигабайтным :)
        • НЛО прилетело и опубликовало эту надпись здесь
        • –3
          Стараюсь не держать ошибок вообще.
          ИМХО если на странице ошибка — страница не работает.
          А если что-то не работает — это сразу видно
          • +2
            Очень идеалистичный вариант. Есть масса ошибок, которые визуально не просматриваются.

            Например, notice-ы об неопределенных переменных — есть случаи, когда это не страшно, есть случаи, когда это может повредить структуру базы и никак визуально не проявиться. Регулярный анализ лога ошибок — единственный способ бороться с такими ошибками в языке без обязательной инициализации переменных.
            • 0
              на это есть локальные вебсервера, команда ab и телепорт.
              Сделали что-то. Запросили бота зайти на все страницы сайта.
              И узнали где у вас битые ссылки, где страницы не отображаются, где ерроры и где тормоза спрятались.
              • 0
                Т. е. логов на продакшне у вас нет или вы их не смотрите, ибо smoke-тестирование выявило все ошибки?
                • –1
                  логи конечно есть, иногда(редко) смотрим их.
                  просто я знаю что ошибок нету.
                  бывает что код просто работает не правильно, но ошибок при этом нету.

                  несколько лет назад был создан scanlog — почти что access лог апача, только удалено.
                  (ПС: сейчас сайту плохо, словили в день месячную нагрузку и не смогли пережевать(считали роботов людьми(и банили за агрессивность) ))

                  Рассказывает мне кто когда куда зашол и сколько времени это потребовало.
                  Фигня в общем, для души.
                  Вот только (покуда для своих) он еще умеет заходить обратно на страницу, которая его вызвала, кушать, анализировать и строить зависимости между страницами.
                  Работает просто — заходим на главную и начинаем рекурсивно кушать линки… кушаем… кушаем…
                  Смотрим какие ссылки куда ведут с какими анкорами, и фиксируем редиректы и ошибки доступа, если они есть…
                  Потом ждем ответа кода системы с сайта… а по сайту ходят люди да роботы, а мы все смотрим на внутренние переходы и достраиваем карту связей сайта…

                  Сайт в 200к страниц обходиться где-то недели за две.
                  На выходе — вся информация по сайту.
                  Где 404, где битая ссылка, где редирект не к месту и какие страницы «далековато» вложены.
                  А ерроры… еррор это статус не 200 в ответе, либо отсутствие отклика кода самого сканлога(последний код на странице)
                  Далее — остается просто зайти на указанную страницу
          • 0
            А как дела с разбором бэктрейсов обстоят? И при этом ошибки в лог хоста валятся? Например:

            [Thu Oct 16 23:26:53 2008] [error] [client 127.0.0.1] PHP Zend_Controller_Dispatcher_Exception:  Invalid controller specified (foo) in /usr/share/php/Zend/Controller/Dispatcher/Standard.php on line 249
            [Thu Oct 16 23:26:53 2008] [error] [client 127.0.0.1] PHP Stack trace:
            [Thu Oct 16 23:26:53 2008] [error] [client 127.0.0.1] PHP   1. {main}() /var/www/work/html/index.php:0
            [Thu Oct 16 23:26:53 2008] [error] [client 127.0.0.1] PHP   2. Zend_Controller_Front->dispatch($request = *uninitialized*, $response = *uninitialized*) /var/www/work/html/index.php:134
            [Thu Oct 16 23:26:53 2008] [error] [client 127.0.0.1] PHP   3. Zend_Controller_Dispatcher_Standard->dispatch($request = class Zend_Controller_Request_Http {...}) /usr/share/php/Zend/Controller/Front.php:946
            
            • 0
              бэктрейс просто не пройдет регэксп
            • 0
              grep -i php error_log | uniq -ui | mail -s «ACHTUNG!!! WARNING!!! ATTENTION!!!» admin@host.com

              в grep можно ставить regexp по типу ошибок php (error|warning|notice), чтобы слать только то, что нужно.
              • 0
                такой сценарий можно реализовать?
                * ошибка в includes.php
                * файл проинклюжен в file1.php и file2.php
                * в итоге получаем две строчки, в которых повторяется только часть строки (не «PHP», а сообщение об ошибке)
                * нужно сгруппировать по этой части (было 4000 хитов с одинаковой ошибкой, но разными request_uri)
                * и указать, сколько повторений было по каждой ошибке и как давно она произошла (еще один кусок строки)

                я не говорю, что нельзя, мне интересно :)
                • +1
                  Нет универсальных решений, но grep'ать тексты при помощи php, чего-то там искать — уж извините. Perl — да, средства binutils — да, а php — нет.

                  Все можно написать, в том числе на bash в одну строчку, вопрос в другом — кому это нужно?

                  Есть xdebug, в нем есть кое-какие средства, есть средства самого php, логи можно вести в разных форматах, логи можно писать по-разному из разных мест (php script/php core/web-server), хоть стрейсы делайте и складывайте в папку.

                  Такие вещи сродни попытке написать ОС на php :)
              • 0
                Спасибо за -3 на коменте с дельным советом… Вы же тут у нас все Знающие… Спасибо!

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое