【问题标题】:Slim 4 monolog does not write logsSlim 4 独白不写日志
【发布时间】:2019-12-16 09:39:17
【问题描述】:

我在我的 slim 4 应用程序中配置了 monolog,并在 ErrorMIddleware 中将 logErrorslogErrorDetails 设置为 true,但是当我遇到错误时,它不会写入日志。为了模拟错误,我打开了我的应用程序上的缓存,我收到了这样的错误Call to undefined function apcu_fetch() b-z doctrine 默认情况下使用 apcu 缓存所有元数据,并且我的开发环境中没有安装 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 默认使用 php error_log 函数来写日志?

【问题讨论】:

    标签: monolog slim-4


    【解决方案1】:

    这就是它在我的dependencies.php 中配置LoggerInterface 的方式。我使用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;
    },
    // ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-11
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多