biller/yii2-cloudwatch-logs

AWS Cloudwatch Logs 的 Yii 2 日志目标

2.0.1 2021-04-02 20:50 UTC

This package is not auto-updated.

Last update: 2024-09-15 12:14:31 UTC


README

AWS Cloudwatch Logs 的 Yii2 日志目标。

安装和配置

通过 composer 安装此包

composer require biller/yii2-cloudwatch-logs

然后将其添加到您的应用程序配置中

<?php
return [
    // ...
    'components' => [
        // ...
        'log' => [
            'targets' => [
                [
                    'class' => \biller\cloudwatchlogs\Target::class,
                    'region' => 'eu-west-1',
                    'logGroup' => '/webserver/production/my-craft',
                    'logStream' => 'instance-1', // omit for automatic instance ID
                    'levels' => ['error', 'warning', 'info', 'trace', 'profile'],
                    'logVars' => ['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION', '_SERVER'],
                    'key' => 'your-key', // omit for instance role
                    'secret' => 'your-secret', // omit for instance role
                ],
                // ...
            ],
        ],

配置选项

  • (字符串) $region (必填) AWS 区域的名称,例如 eu-west-1
  • (字符串) $logGroup (必填) 日志组的名称。
  • (字符串) $logStream (可选) 日志流的名称。如果省略,它将尝试确定运行在 EC2 实例上的 ID。
  • (数组) $levels (可选) 日志级别。默认由 Yii2:['error', 'warning', 'info', 'trace', 'profile']
  • (数组) $logVars (可选) 要记录的变量。默认由 Yii2:['_GET', '_POST', '_FILES', '_COOKIE', '_SESSION', '_SERVER']
  • (字符串) $key (可选) 您的 AWS 访问密钥。
  • (字符串) $secret (可选) 您的 AWS 秘钥。

速率限制

Cloudwatch Logs API 要求将序列令牌与消息一起发送到日志流。在向日志流传输消息后,将返回此令牌,用于在下一个传输中使用。对于多进程系统,这很难处理。

因此,AWS Cloudwatch Logs 不支持多个进程同时写入相同的日志流。他们官方的方法是为每个实例上的每个进程创建单独的日志流。但考虑到 PHP-FPM 在多个实例上的动态子进程。这会导致一段时间后日志组中出现成千上万的废弃日志流。空日志流不会被自动删除并保留在日志组中。它们不收取任何费用,但会使日志组非常杂乱。

我们的方法是每个实例只创建一个日志流。为了能够同时从多个进程发送日志流,必须在每次传输之前查询日志流的当前序列令牌。但 AWS Cloudwatch Log API 对此类请求有每秒 60 请求的速率限制。

为了避免遇到此速率限制,强烈建议只将那些发生频率低且重要的日志直接发送到 Cloudwatch Logs。例如警告和错误。

在具有许多同时进程且日志负载很高的大型基础设施中,仍然最好使用文件日志和 Cloudwatch Log Agent,因为这只是一个单进程。

也许未来会有所改变。

Cloudwatch Logs Insights

如果您想使用 Insights 解析日志,那么可以这样做

fields @timestamp, @message
| sort @timestamp desc
| limit 20
| parse '[*][*][*][*][*] *' as ip, userId, sessionId, logLevel, category, message