Анализатор логов 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
        нет, не тот :)
        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 на коменте с дельным советом… Вы же тут у нас все Знающие… Спасибо!
                    0

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

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