簡體   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