php Laravel 8中Monolog MongoDBHandler出现绑定解析异常错误

mlnl4t2r  于 2023-02-07  发布在  PHP
关注(0)|答案(2)|浏览(180)

我尝试创建一个mongodb日志记录通道

'mongo' => [
    'driver' => 'monolog',
    'handler' => \Monolog\Handler\MongoDBHandler::class,
    'formatter' => \Monolog\Formatter\MongoDBFormatter::class,
    'handler_with' => [
        'mongo' => new \MongoDB\Client("mongodb://localhost:27017"),
        'database' => 'testdb',
        'collection' => 'testcoll'
    ]
],

然而,我得到错误:

Illuminate\Contracts\Container\BindingResolutionException(code: 0): Unresolvable dependency resolving [Parameter #0 [ <required> $mongodb ]] in class Monolog\Handler\MongoDBHandler

只有当我尝试向类构造函数添加类型提示时,错误才得以解决,但显然我不能这样做,因为它是一个包:

public function __construct(Client<<if I add this it works>> $mongodb, string $database, string $collection, $level = Logger::DEBUG, bool $bubble = true)

有什么解决办法吗?

5kgi1eie

5kgi1eie1#

所以,我想在这里添加一个完整的答案,因为这篇文章是第一个显示时,寻找添加一个mongo日志记录器,因为答案是埋在评论,我想添加一个适当的答案。
解决方案是将handler_with数组中的键mongo更改为mongodb
工作代码如下所示:

'mongo' => [
    'driver' => 'monolog',
    'handler' => \Monolog\Handler\MongoDBHandler::class,
    'formatter' => \Monolog\Formatter\MongoDBFormatter::class,
    'handler_with' => [
        'mongodb' => new \MongoDB\Client("mongodb://localhost:27017"),
        'database' => 'testdb',
        'collection' => 'testcoll'
    ]
],

另外,可以在formatter的同一层添加以下元素来设置自定义最大嵌套层,这是因为默认情况下,存储的文档深度不能大于3,并且在日志中会自动转换为“[...]”。

'formatter_with' => [
   'maxNestingLevel' => 10
],

警告,在递归的情况下,或者是一个非常深的数组,它可能会在mongo中引起问题,因为它不支持超过100层的嵌套。

xxhby3vn

xxhby3vn2#

根据Laravel 8.x文档:

'mongo' => [
    'driver'  => 'monolog',
    'handler' => \Monolog\Handler\MongoDBHandler::class,
    'formatter' => \Monolog\Formatter\MongoDBFormatter::class,
    'with' => [ // <-- This is `with` instead of `handler_with`
        // 'mongodb' => new \MongoDB\Client("mongodb://localhost:27017"), <-- This line will cause an error in `php artisan config:cache`
        'database' => 'testdb',
        'collection' => 'testcoll'
    ],
],

因此,您需要为MongoDBHandler配置服务。正如您在查看处理程序源代码时提到的,第一个参数是$mongodb

public function __construct($mongodb, string $database, string $collection, $level = Logger::DEBUG, bool $bubble = true)

并且为了能够解决这种依赖性,我们可以配置服务容器:

// AppServiceProvider.php

// ...

    public function register() {
        $this->app->when(\Monolog\Handler\MongoDBHandler::class)
            ->needs('$mongodb')
            ->give(app(
                \MongoDB\Client::class,
                [
                    'uri' => 'mongodb://localhost:27017'
                ]
            ));
    }

// ...

相关问题