Я немного запутался в использовании MongoLog для отправки логов на стандартный вывод. Я использую этот код:
# console/proxy-server.php
require_once '../vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\ErrorLogHandler;
// This is for test - it *definitely* goes to stdout!
echo "Hello";
// Here is the logger
$logger = new Logger('stdout');
$logger->pushHandler(new ErrorLogHandler());
$logger->info('Logging');
Строка журнала действительно выводит на консоль, где я запускаю программу, но, похоже, она не переходит в настоящий стандартный вывод. Тем не менее, «Привет» от echo
работает отлично.
Я запускаю его из сценария оболочки таким образом:
#!/bin/sh
# Write to both stdout and a log file
php console/proxy-server.php | tee --append proxy.log
Если я использую tail -f proxy.log
в другой консоли, то echo
сообщение появляется в режиме реального времени, а интересующие меня журналы — нет (даже если я аккуратно выйду из скрипта, хотя я ожидаю, что они тоже будут добавляться в режиме реального времени). Тем не менее, оба набора выходов являются вывод на консоль, в которой я запустил свой скрипт.
Этот подход к реализации был получен из этой статьи блога.
В комментариях к статье блога есть альтернативное решение, использующее StreamHandler
, что так. Это то же самое, что и выше, за исключением измененного pushHandler()
линия:
use Monolog\Handler\StreamHandler;
...
$logger->pushHandler(new StreamHandler("php://stdout"));
это является записан tee
Таким образом, похоже, что некоторые stdouts более равны, чем другие! Интересно, есть ли эффективно много stdouts, и tee
только записывает «настоящий»? В чем разница между двумя подходами с точки зрения труб оболочки?
Я не проверял это, так как мое альтернативное решение отлично работает с tee
, Однако в последнее время я подозреваю, что ErrorLogHandler
на самом деле отправляет вывод stderr
не stdout
что было бы почему tee
не рендерит это.
Если кто-то еще столкнется с этим, я должен быть заинтересован в их наблюдениях. В некотором смысле это крайний случай, так как в большинстве случаев вывод ошибок выводится на консоль точно так же, как вывод без ошибок, и обычно невозможно отличить разницу.
Других решений пока нет …