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

标签 php amazon-s3 monolog

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

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

到目前为止,我正在我的 Pimple 依赖注入(inject)定义中尝试这样的事情:

$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() 被调用时写入,能够看到日志实时增长会很好,但我猜这将需要一种套接字方法。

关于php - 配置 PHP Monolog 以通过流登录到 Amazon S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24271489/

相关文章:

php - 在单个产品页面上添加一个复选框,这会在 Woocommerce 中增加额外费用

amazon-web-services - 带有前缀和分隔符的 boto s3 存储桶对象过滤器

javascript - XUL:直接上传到 S3,但不使用文件输入元素

php - Monolog 没有写入正确的日志文件

php - 如何列出 Symfony 中所有内置/预定义的 Monolog channel ?

php - 当 html 输入名称与列名称不同时使用 Laravel 验证

PHP/MYSQL Where 子句作为数组

amazon-web-services - CloudFront 响应 403 Forbidden,而不是触发 Lambda

Symfony2/Monolog : Log Level - only show app. 信息?

php - 查看在另一个节点中引用的 drupal 节点