chequemotiva / monolog-cloudwatch-handler
Monolog与CloudWatch日志集成
1.0.0-rc2
2022-10-07 08:10 UTC
Requires
- php: ^8.0
- aws/aws-sdk-php: ^3.230
- monolog/monolog: ^2.5
README
PHP日志库Monolog的处理器,用于将日志条目发送到AWS CloudWatch Logs服务。
在使用此库之前,建议您熟悉AWS CloudWatch服务的定价。
免责声明
此库通过AWS PHP SDK使用AWS API,该SDK对并发请求有限制;这意味着在高并发或高负载应用程序中,它可能无法以最佳方式运行。请考虑使用其他解决方案,例如将日志记录到stdout并使用fluentbit重定向日志。
要求
- PHP ^8.0
- 具有适当权限的AWS账户(请参阅以下权限列表)
与maxbanton/cwh的区别
此库基于maxbanton/cwh。主要区别如下
- 此库不执行任何GET请求。
- CloudWatch日志序列令牌可以跨请求存储和重用。
- 必须存在日志组,它不会自动创建。
通过这些更改,日志保存速度更快,并且CloudWatch日志配额得到优化。
特性
- 最多发送10,000批日志以避免速率超过错误。
- 无GET请求。
- AWS CloudWatch日志的懒加载。
- 适用于Web应用程序和长期运行的CLI守护程序和工作程序。
- 序列令牌持久性。
- 创建日志流。
安装
通过运行以下命令安装最新版本:Composer
$ composer require chequemotiva/monolog-cloudwatch-handler:1.0.0-rc2
基本用法
<?php
use \Aws\CloudWatchLogs\CloudWatchLogsClient;
use \Chequemotiva\Monolog\CloudWatch\CloudWatchHandler;
use \Monolog\Logger;
use \Monolog\Formatter\JsonFormatter;
// Instantiate AWS SDK CloudWatch Logs Client
$client = new CloudWatchLogsClient([
'region' => '<aws-region>',
'version' => 'latest',
'credentials' => [
'key' => '<aws-key>', // AWS access key ID
'secret' => '<aws-secret>', // AWS secret access key
'token' => '<aws-access-token>', // AWS session token (optional)
]
]);
$handler = new CloudWatchHandler(
client: $client,
group: '<log-group-name>', // Existing log group name
stream: '<log-stream-name>', // Log stream name, will be created if it doesn't exist
level: \Psr\Log\LogLevel::DEBUG,
);
// Optionally set the JsonFormatter to be able to access your log messages in a structured way
$handler->setFormatter(new JsonFormatter());
// Create a log channel
$log = new Logger('<logger-name>');
// Set handler
$log->pushHandler($handler);
// Add records to the log
$log->debug('Foo');
$log->warning('Bar');
$log->error('Baz');
持久化序列令牌
默认情况下,CloudWatch日志序列令牌存储在内存中,但处理器可以配置为使用sequenceToken
参数将其存储在文件系统中,以便在未来的请求中重用,而无需额外的API调用。
use \Chequemotiva\Monolog\CloudWatch\CloudWatchHandler;
use \Chequemotiva\Monolog\CloudWatch\SequenceTokenRepositories\FilesystemSequenceTokenRepository;
$handler = new CloudWatchHandler(
client: $client,
group: '<log-group-name>',
stream: '<log-stream-name>',
sequenceToken: new FilesystemSequenceTokenRepository('<cache-path>'),
);
您可以通过实现接口\Chequemotiva\Monolog\CloudWatch\SequenceTokenRepositories\SequenceTokenRepositoryInterface
来自定义持久化机制。
限制缓冲区大小
日志事件被缓冲并批量发送到CloudWatch日志,最多10,000个日志事件。您可以通过指定eventBuffer
参数来修改此行为
use \Chequemotiva\Monolog\CloudWatch\CloudWatchHandler;
use \Chequemotiva\Monolog\CloudWatch\EventBuffers\OverflowEventBuffer;
$handler = new CloudWatchHandler(
client: $client,
group: '<log-group-name>',
stream: '<log-stream-name>',
eventBuffer: new OverflowEventBuffer(1), // Send events one by one
);
可以通过实现接口\Chequemotiva\Monolog\CloudWatch\EventBuffers\EventBufferInterface
来实现其他缓冲区策略。
AWS IAM所需权限
API用户需要以下权限
AWS IAM策略完整JSON示例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream"
],
"Resource": "<log-group-arn>"
},
{
"Effect": "Allow",
"Action": [
"logs:PutLogEvents"
],
"Resource": [
"<log-stream-arn-1>",
"<log-stream-arn-2>"
]
}
]
}
问题
请随时报告任何问题
贡献
请检查此文档