配置PHP Monolog通过流登录到Amazon S3

jos*_*erk 4 php amazon-s3 monolog

我们正在使用Monolog来记录服务器端PHP工作程序脚本的输出,该脚本在Amazon Elastic Beanstalk EC2服务器实例上执行。访问日志文件非常困难,尤其是考虑到随着需求的变化,服务器会启动和关闭。

如何配置Monolog直接登录到Amazon S3流/存储桶?

到目前为止,我正在Pimple依赖项注入定义中尝试执行以下操作:

$this->container['log'] = function ($c) {
    $logger = new \Monolog\Logger('psd_worker');
    $handler = new \Monolog\Handler\StreamHandler('s3://mybucket/logs/test.log');
    $logger->pushHandler($handler);
    return $logger;
};
Run Code Online (Sandbox Code Playgroud)

但存储桶中没有日志文件,我也没有任何异常。

稍作测试后,我可以将s3://写入S3存储桶:

$stream = fopen("s3://{$bucket}/{$key}", 'w');
fwrite($stream, 'Hello S3 World!');
fclose($stream);
Run Code Online (Sandbox Code Playgroud)

但我希望将Monologs日志记录功能写入此存储桶。

jos*_*erk 5

设法使其工作。首先进行Amazon S3 DI服务,确保致电$s3_client->registerStreamWrapper()

    $this->container['s3_client'] = function ($c) {
        $s3_client = \Aws\S3\S3Client::factory([
            'key' => Config::get('amazon_s3.key'),
            'secret' => Config::get('amazon_s3.secret')
        ]);
        $s3_client->registerStreamWrapper();
        return $s3_client;
    };
Run Code Online (Sandbox Code Playgroud)

然后,记录器应调用s3_client以确保进行流包装器注册:

    $this->container['log'] = function ($c) {
        $this->container['s3_client'];

        $logger = new \Monolog\Logger('psd_worker');
        $handler = new \Monolog\Handler\StreamHandler("s3://mybucket/logs/monolog_s3.log");
        $logger->pushHandler($handler);

        return $logger;
    };
Run Code Online (Sandbox Code Playgroud)

然后,在调用记录器的记录方法时:

    $log = $this->container['log'];
    $log->info("Another from Monolog to Amazon S3!!!");
Run Code Online (Sandbox Code Playgroud)

将导致数据写入已配置的存储桶。看来只有在fclose()调用时才写入数据,这样才能很好地看到日志的实时增长,但是我猜测这将需要套接字方法。