Логирование для скриптов на кроне с помощью monolog

1. Устанавливаем

composer require monolog/monolog

2. Подключаем, если composer autoload ещё не подключен

require_once 'vendor/autoload.php';

3. Создаём логгер в нашем крон-скрипте

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$logger = new Logger('main');
$logger->setHandlers(
    array(
        new StreamHandler('php://stdout'),
        new StreamHandler('php://stderr', Logger::ERROR),
    )
);
// это сообщение будет сохранено в файл
$logger->info('Info message');
// это сообщение будет сохранено в файл и отправлено на почту
$logger->error('Error message'); 

4. Crontab: делаем, чтобы все сообщения сохранялись в файл, а ошибки отправлялись на почту

4.1. Включаем отправку на почту, добавив в crontab:

MAILTO=login@example.com

4.2. Добавляем запуск скрипта в крон:

0 0 * * * /usr/bin/php /path/to/script.php >> /path/to/log.log

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

5. Другие варианты перенаправления stdout и stderr потоков

Перенаправляем всё в /dev/null (т. е. никуда не записываем и не отправляем на почту):

/usr/bin/php /path/to/script.php > /dev/null 2>&1

Ничего не перенаправляем, отправляем всё на почту:

/usr/bin/php /path/to/script.php

Записываем всё в файл, и не отправляем ничего на почту:

/usr/bin/php /path/to/script.php >> /path/to/log.log 2>/dev/null