chequemotiva/monolog-cloudwatch-handler

Monolog与CloudWatch日志集成

1.0.0-rc2 2022-10-07 08:10 UTC

This package is auto-updated.

Last update: 2024-09-07 12:57:23 UTC


README

PHP日志库Monolog的处理器,用于将日志条目发送到AWS CloudWatch Logs服务。

在使用此库之前,建议您熟悉AWS CloudWatch服务的定价

免责声明

此库通过AWS PHP SDK使用AWS API,该SDK对并发请求有限制;这意味着在高并发或高负载应用程序中,它可能无法以最佳方式运行。请考虑使用其他解决方案,例如将日志记录到stdout并使用fluentbit重定向日志。

要求

  • PHP ^8.0
  • 具有适当权限的AWS账户(请参阅以下权限列表)

与maxbanton/cwh的区别

此库基于maxbanton/cwh。主要区别如下

  1. 此库不执行任何GET请求。
  2. CloudWatch日志序列令牌可以跨请求存储和重用。
  3. 必须存在日志组,它不会自动创建。

通过这些更改,日志保存速度更快,并且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用户需要以下权限

  1. PutLogEvents aws文档
  2. CreateLogStream aws文档

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>"
            ]
        }
    ]
}

问题

请随时报告任何问题

贡献

请检查此文档