Slim 4 monolog не пишет логи
Я настроил monolog
в моем приложении Slim 4 и установите logErrors
а также logErrorDetails
верно в ErrorMIddleware
но когда я получаю ошибку, он не пишет логи. Чтобы имитировать ошибку, я включаю кеш в своем приложении и получаю такую ошибкуCall to undefined function apcu_fetch()
bz doctrine
использование apcu по умолчанию для кеширования всех метаданных, а apcu не установлен на моем dev env.
Здесь PHP-DI
конфиг для логгера:
LoggerInterface::class => static function (Container $container) {
$config = $container->get(Config::class);
$logger = new Logger((string)$config->get('logger.name'));
$fileNameSuffix = PHP_SAPI === 'cli' ? 'php-cli-' : 'php-fpm';
$logger->pushHandler(
new StreamHandler(
$config->get('logger.log_dir') . '/' . $fileNameSuffix . '-' . $config->get('logger.name') . '.log',
$config->get('logger.log_level'))
);
if ((bool)$config->get('main.debug')) {
$logger->pushHandler(new FirePHPHandler());
}
return $logger;
}
и вот ErrorMiddleware
config:
$definitions[ErrorMiddleware::class] = static function(ContainerInterface $container): ErrorMiddleware {
$middleware = new ErrorMiddleware(
$container->get(CallableResolverInterface::class),
$container->get(ResponseFactoryInterface::class),
(bool)$container->get(Config::class)->get('main.debug'), //false or true
$container->has(LoggerInterface::class) ? true : false,
$container->has(LoggerInterface::class) ? true : false
);
$middleware->setErrorHandler(HttpNotFoundException::class, $container->get(NotFoundHandler::class));
return $middleware;
};
И да, я добавляю это промежуточное ПО в App
нравится $app->add($container->get(ErrorMiddleware::class));
Я проверял различные репозитории Github с тонким скелетом 4 и не нашел никаких дополнительных конфигураций, поэтому я не знаю, почему он не записывает логи в файлы. Может мне нужно установить собственный обработчик ошибок по умолчанию? Тонкий 4 по умолчанию с использованием phperror_log
функция записи логов?
1 ответ
Вот как он настраивает LoggerInterface
в моем dependencies.php
. Я использую пакет bzikarsky / gelf-php для отправки правильного формата GELF.
Для местной среды StreamHandler
, для любой другой среды GelfHandler
используется.
При использовании Graylog следите за точным портом и протоколом. В моем примере я используюUdpTransport
. Не стесняйтесь использовать другой транспорт, напримерTcpTransport
.
dependencies.php
<?php
use Monolog\Logger;
// ...
LoggerInterface::class => function (ContainerInterface $c) {
$config = $c->get(Configuration::class)->getArray('logger');
$logger = new Logger($config['name']);
if ($c->get(Configuration::class)->getString('settings.environment') === 'local') {
$processor = new UidProcessor();
$logger->pushProcessor($processor);
$handler = new StreamHandler($config['path'], $config['level']);
} else {
$transport = new UdpTransport(
$config['graylog']['host'],
$config['graylog']['port'],
UdpTransport::CHUNK_SIZE_LAN
);
$publisher = new Publisher();
$publisher->addTransport($transport);
$handler = new GelfHandler($publisher);
}
$logger->pushHandler($handler);
return $logger;
},
// ...