如何解决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_ACCESS
和 AWS_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 举报,一经查实,本站将立刻删除。