微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel Vapor 自定义日志以 JSON 格式存储到 Amazon AWS Cloudwatch

如何解决Laravel Vapor 自定义日志以 JSON 格式存储到 Amazon AWS Cloudwatch

认情况下,Laravel Vapor 将 laravel.log 文件推送到 strerr 输出。这是被 Lambda 捡起来扔给 Cloudwatch 的。除非您通过 Vapor 用户界面查看,否则很难看透。 寻找一种简单的方法来执行此操作并将它们直接推送到 Cloudwatch(包含多个文件)。

解决方法

首先添加了这个很棒的库

composer require maxbanton/cwh 

然后将此添加到您的日志配置...

        'cloudwatch' => [
            'driver' => 'custom','via' => \App\Logging\CloudWatchLoggerFactory::class,'formatter' => Monolog\Formatter\JsonFormatter::class,'cloudwatch_stream_name' => 'laravel','sdk' => [
                'region' => 'eu-west-1','version' => 'latest','credentials' => [
                    'key' => env('AWS_CW_ACCESS'),'secret' => env('AWS_CW_SECRET')
                ]
            ],'retention' => 730,'level' => 'debug',],

您需要为有权访问 Cloudwatch 的 IAM 用户添加 AWS_CW_ACCESSAWS_CW_SECRET 密钥。

然后添加App/Logging/CloudWatchLoggerFactory.php,内容如下..

<?php

namespace App\Logging;

use Aws\CloudWatchLogs\CloudWatchLogsClient;
use Maxbanton\Cwh\Handler\CloudWatch;
use Monolog\Formatter\JsonFormatter;
use Monolog\Logger;

class CloudWatchLoggerFactory
{
    /**
     * Create a custom Monolog instance.
     *
     * @param  array  $config
     * @return \Monolog\Logger
     */
    public function __invoke(array $config)
    {
        $sdkParams = $config["sdk"];
        $tags = $config["tags"] ?? [ ];
        $name = $config["name"] ?? 'cloudwatch';
        
        // Instantiate AWS SDK CloudWatch Logs Client
        $client = new CloudWatchLogsClient($sdkParams);
        
        // Log group name,will be created if none
        $groupName = config('app.name') . '-' . config('app.env');

        // Log stream name,will be created if none
        // $streamName = config('app.hostname');
        $streamName = $config["cloudwatch_stream_name"];

        // Days to keep logs,14 by default. Set to `null` to allow indefinite retention.
        $retentionDays = $config["retention"];
        // Instantiate handler (tags are optional)
        $handler = new CloudWatch($client,$groupName,$streamName,$retentionDays,10000,$tags);
        $handler->setFormatter(new JsonFormatter());
        // Create a log channel
        $logger = new Logger($name);
        // Set handler
        $logger->pushHandler($handler);
        //$logger->pushProcessor(new CompanyLogProcessor()); //Use this if you want to adjust the JSON output using a log processor
        return $logger;
    }
}

然后您可以将其用作任何日志...即Log::channel('cloudwatch')->info('hey');

要将默认的 laravel.log 强制到这里并在蒸气中显示,只需将其添加为堆栈

        'vapor' => [
            'driver' => 'stack','channels' => ['stderr','cloudwatch'],'ignore_exceptions' => false,

然后在您的环境变量中将 logging.default 设置设置为 vapor

如果您想要更多的日志记录通道,只需将 cloudwatch 通道设置复制到一个新的通道设置并确保调整 cloudwatch_stream_name

感谢我在 Stackoverflow 上找到的其他答案帮助我到达这里。我想直接在 Laravel Vapor 的回答下记录这个,因为我想很多其他人会在尝试这样做时陷入困境!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。