0

monolog在我的 slim 4 应用程序中进行了配置,并将 and 设置logErrorslogErrorDetailstrue,ErrorMIddleware但是当我遇到错误时,它不会写入日志。为了模拟错误,我打开了我的应用程序上的缓存,我得到了一个像这样的错误,默认情况下使用Call to undefined function apcu_fetch()apcudoctrine缓存所有元数据,并且我的开发环境中没有安装 apcu。

这是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配置:

     $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));

我检查了不同的 slim 4 骨架 Github 存储库,但没有找到任何额外的配置,所以我不知道为什么它没有将日志写入文件。也许我需要设置一个自定义的默认错误处理程序?作为 slim 4 默认的一个使用 phperror_log函数来写日志?

4

1 回答 1

0

这就是它LoggerInterface在我的dependencies.php. 我使用bzikarsky/gelf-php包发送正确的GELF格式。

对于本地环境,使用StreamHandler,对于任何其他环境GelfHandler

使用 Graylog 时,请注意确切的端口和协议。在我的示例中,我使用UdpTransport. 随意使用其他一些交通工具,如TcpTransport.

依赖项.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;
},
// ...
于 2020-02-25T12:53:18.360 回答