Хоть и есть способы отлавливать фатальные ошибки в PHP, необходимость наблюдать за логами на предмет любых других ошибок остается. Логи ведь бывают всевозможные. Например, от процессов выполняющихся под контролем Supervisor. Да от чего угодно!

Для мониторинга логов чего только не придумано. Можно найти решение на основе Monit, а можно доработать Logwatch чтобы тот проверял логи чаще. Cписок решений для наблюдения за логами можно продолжать долго.

Ведь можно проще!

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

С нашей задачей справится и простой скрипт.

#!/bin/bash
set -o nounset -o errexit
cd $(dirname $0)/logs
tail -n 1000 error.log | grep -v 'PHP Notice:' | tail > error.log.new
if [[ -f error.log.old ]]; then
    diff --unchanged-line-format= --old-line-format= \
         --new-line-format='%L' error.log.old error.log.new || true
fi
mv error.log.new error.log.old

Что делает этот скрипт?

  1. Сначала мы переходим в обычный каталог с логами, исходя из того, что сам скрипт лежит в каталоге www.

  2. Затем берем последнюю тысячу строк из error.log и исключаем из них очевидные не-ошибки.

  3. Наконец, показываем лишь появившиеся с последнего запуска строки с ошибками.

Вся соль этого скрипта в опциях к компанде diff которые оставляют в выводе только новые строки.

Как применять?

Создаём crontab из двух строк и получаем в письме новые ошибки, если такие появились за последние десять минут.

MAILTO=you@example.com
*/10 * * * * ./www/logwatch

В сообщении будет только текст новых ошибок.

[...] [error] [client 127.0.0.1] PHP Warning:  strlen() expects parameter...
[...] [error] [client 127.0.0.1] File does not exist: ...