繁体   English   中英

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

[英]Configure PHP Monolog to log to Amazon S3 via stream

我们使用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;
};

但是没有日志文件出现在存储桶上,我也没有得到任何例外。

一个小测试显示我可以通过s3://写入S3存储桶:

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

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

管理以使其工作。 首先制作一个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;
    };

然后是记录器,它应调用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;
    };

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

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

将导致数据写入配置的存储桶。 看来数据只在调用fclose()时写入,能够看到日志生长会很好,但我猜这需要套接字方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM