Quay lại
Laravel 10 Logging AWS CloudWatch

Xin chào các bạn hôm nay mình sẽ hướng dẫn cách có thể ghi logs với một third-party trong Laravel, như bình thường chúng ta làm việc với môi trường DEV thì chúng ta thường lưu file logs trên hệ thống luôn đúng không? Đó là môi trường dev thì Ok chúng ta có thể debug trực tiếp nhưng khi chúng ta làm việc với hệ thống elastic hoặc chạy với môi trường production thì khuyến khích là không nên thay vì đó nên sử dụng một số third-party như AWS CloudWatch, Elasticsearch, hoặc các dịch vụ quản lý log khác, dưới đây là một số lý do:

  1. Tính linh hoạt và co giãn: Hệ thống auto scaling thường thay đổi kích thước dựa trên tải công việc hoặc yêu cầu. Khi số lượng máy chủ thay đổi, việc quản lý và theo dõi log trực tiếp trên các máy chủ có thể trở nên phức tạp và không ổn định. Sử dụng một dịch vụ quản lý log bên ngoài giúp đảm bảo tính linh hoạt và co giãn của hệ thống.

  2. Tính toàn vẹn dữ liệu: Lưu trữ log trên hệ thống auto scaling hoặc production có thể tạo ra rủi ro mất dữ liệu khi máy chủ bị lỗi, hệ thống bị gián đoạn hoặc bị xóa. Bằng cách lưu trữ log trên một dịch vụ bên thứ ba, bạn có thể đảm bảo tính toàn vẹn của dữ liệu log.

  3. Tiện lợi trong quản lý: Sử dụng một dịch vụ quản lý log bên thứ ba thường cung cấp các công cụ và tính năng tiện ích để tìm kiếm, lọc, phân tích và hiển thị log một cách dễ dàng và hiệu quả hơn so với việc quản lý log trên các máy chủ riêng lẻ.

  4. Hiệu suất và hiệu quả chi phí: Lưu trữ log trên hệ thống auto scaling hoặc production có thể tăng tải cho hệ thống và làm giảm hiệu suất. Sử dụng một dịch vụ quản lý log bên thứ ba có thể giúp giảm bớt tải cho hệ thống và tối ưu hóa chi phí lưu trữ log.

Chính vì thế ở bài viết này chúng ta sẽ cùng nhau triển khai tính năng đẩy logs trực tiếp từ Laravel vào AWS CloudWatch kết hợp với Monolog Handler. Điều này mang lại lợi ích làm cho việc quản lý log trở nên dễ dàng và linh hoạt hơn, cũng như giúp bạn tập trung vào việc phát triển ứng dụng mà không phải lo lắng về việc lưu trữ và quản lý log.

Việc ghi log vào AWS CloudWatch từ Laravel có thể giúp bạn kiểm soát và theo dõi hiệu suất của ứng dụng, xác định các vấn đề và lỗi, cũng như đưa ra quyết định dựa trên dữ liệu log.

Trong hướng dẫn này, chúng ta sẽ khám phá cách cấu hình Laravel để ghi log trực tiếp vào AWS CloudWatch, từ việc cài đặt và cấu hình AWS SDK cho Laravel, đến việc sử dụng AWS CloudWatch Monolog Handler để chuyển log từ Laravel vào AWS CloudWatch. Đồng thời, chúng ta cũng sẽ tìm hiểu cách quản lý và kiểm tra log trên AWS CloudWatch Console.

Để thực hiện được với cloudwatch mình có một số yêu cầu sau:

  • Có tài khoản AWS.
  • Có hiểu biết cơ bản về IAM và policies.

Bước 1: Tạo CloudWatch Log

  1. Đăng nhập vào AWS Management Console: Truy cập vào AWS Management Console tại địa chỉ: https://aws.amazon.com/console/

  2. Mở dịch vụ CloudWatch: Trong giao diện của AWS Management Console, tìm và chọn dịch vụ "CloudWatch". Bạn có thể sử dụng thanh tìm kiếm ở góc trên cùng bên phải để nhanh chóng tìm thấy dịch vụ này.

  3. Chọn "Logs" trong bảng điều khiển của CloudWatch: Trong trang chính của dịch vụ CloudWatch, chọn "Logs" từ thanh điều hướng bên trái.

  4. Tạo log group mới: Trong trang "Log groups", chọn nút "Create log group".

  5. Đặt tên cho log group: Trong hộp thoại "Create log group", nhập tên cho log group mới của bạn vào trường "Log group name". Đảm bảo bạn chọn region phù hợp để lưu trữ log group. Sau khi điền thông tin, nhấn "Create log group" để tạo log group.

  6. Kiểm tra log group: Sau khi tạo, bạn sẽ thấy log group mới xuất hiện trong danh sách các log group trên trang "Log groups".

  7. Tạo "Log stream" vào chi tiết Log groups sau tạo thì tạo Log stream.

Bước 2: Thiết Lập IAM User

  1. Đăng nhập vào AWS Console: Đăng nhập vào AWS Console bằng tài khoản có đủ quyền để thực hiện các thay đổi về IAM và cloudwatch.

  2. Tạo một IAM User mới:

    • Trong AWS Console, điều hướng đến trang IAM.
    • Chọn "Users" từ menu bên trái và nhấn vào nút "Add user".
    • Nhập tên cho user và chọn loại truy cập (giữ mặc định là "Programmatic access" hoặc "Provide user access to the AWS Management Console".
    • Vào Tab "Security credentials" trong user bạn vừa tạo sau đó tìm đến block "Access keys" để có thể tạo Access Key và Secret Access Key.
    • Tiếp theo, chọn quyền (policies) cho user này. Bạn có thể chọn một policy có sẵn hoặc tạo một policy mới.
  3. Tạo hoặc áp dụng một Policy cho IAM User:

    • Chúng ta nên custom một policy mới cho user này để chúng ta dễ kiểm soát những actions của user trên tài nguyên cloudwatch thay vì chọn một cái "AmazonCloudWatchFullAccess" nha:
      • Click vào user bạn vừa tạo, sau đó chọn "Add permissions".
      • Sau đó chọn "Create inline policy".
      • Chọn "service Cloudwatch" và sau click vào tab "JSON" để tạo policy từ một định dạng JSON.
      • Copy IAM policy dưới đây và paste vào "Policy editor":
        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "logs:CreateLogGroup",
                        "logs:DescribeLogGroups"
                    ],
                    "Resource": "*"
                },
                {
                    "Effect": "Allow",
                    "Action": [
                        "logs:CreateLogStream",
                        "logs:DescribeLogStreams",
                        "logs:PutRetentionPolicy",
                        "logs:FilterLogEvents"
                    ],
                    "Resource": "arn:aws:logs:ap-southeast-1:178108053885:log-group:group-log:*"
                },
                {
                    "Effect": "Allow",
                    "Action": [
                        "logs:PutLogEvents",
                        "logs:GetLogEvents",
                        "logs:FilterLogEvents"
                    ],
                    "Resource": [
                        "arn:aws:logs:ap-southeast-1:178108053885:log-group:group-log:log-stream:error-log"
                    ]
                }
            ]
        }
      • Điều chỉnh các quyền truy cập (actions) và tài nguyên (resources) theo nhu cầu của bạn sau đó thì chọn "Next".
      • Bước cuối cùng nhập "Policy name" và gắn policy này cho user.

Sau khi hoàn thành, IAM user sẽ có các Access Key và Secret Access Key, mà bạn cần sử dụng trong ứng dụng của mình để truy cập vào AWS cloudwatch. Hãy lưu trữ các thông tin này một cách an toàn, vì chúng rất quan trọng và không thể lấy lại khi đã mất. Đến cuối bài viết này mình sẽ giải thích sự giống và khác nhau của "IAM policy" và "Bucket policy" nha.

Bước 3: Sử Dụng Trong Laravel

Bước 0: Cấu hình .env các bạn lấy access keysecret key trong user IAM của các bạn tạo ở bước trên sau đó thì cấu hình theo các biến môi trường dưới đây.

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=ap-southeast-1

Bước 1: Sử dụng composer để tải package của mình để hỗ trợ CloudWatch logs.

composer require dhs/cloudwatch-laravel-log:dev-master

Hoặc:

Có thể làm bằng cách tự custom là tạo thêm thư mục Handler và tạo thêm file CloudWatch.php trong thư mục app. Đường dẫn:

App\Handler\CloudWatch.php

Vì file này khá dài nên các bạn lên git của mình copy và paste vào file CloudWatch.php nhé! Link githib của mình.

Bước 2: Tạo thêm thư mục Logging và tạo thêm file CloudWatchLoggerFactory.php trong thư mục app.

App\Logging\CloudWatchLoggerFactory.php
<?php

namespace App\Logging;

use Aws\CloudWatchLogs\CloudWatchLogsClient;
use Dhs\CloudWatchLogs\Handler\CloudWatch; //Hoặc use App\Handler\CloudWatch;
use Monolog\Logger;
use Monolog\Formatter\JsonFormatter;
use Monolog\Level;

class CloudWatchLoggerFactory
{
    /**
     * Create a custom Monolog instance.
     *
     * @param  array  $config
     * @return \Monolog\Logger
     */
    public function __invoke(array $config)
    {        
        // Instantiate AWS SDK CloudWatch Logs Client
        $client = new CloudWatchLogsClient($config['sdk']);

        // Instantiate handler (tags are optional)
        $handler = new CloudWatch(
            $client, 
            $config['group_name'],
            $config['stream_name'],
            $config['retention'], 
            10000,
            ['my-awesome-tag' => 'tag-value'],
            Level::Info
        );

        // Optionally set the JsonFormatter to be able to access your log messages in a structured way
        $handler->setFormatter(new JsonFormatter());

        $name = $config['name'] ?? 'cloudwatch';
        
        // Create a log channel
        $logger = new Logger($name);
        
        // Set handler
        $logger->pushHandler($handler);
        
        return $logger;
    }  

Bước 3: Cấu hình logging, các bạn vào trong file logging.php trong thư mục config sau đó thì copy đoạn code dưới đây.

'channels' => [
    ...
    'cloudwatch' => [
        'driver' => 'custom',
        'via' => \App\Logging\CloudWatchLoggerFactory::class,
        'sdk' => [
            'region' => env('AWS_DEFAULT_REGION', 'eu-west-1'),
            'version' => 'latest',
            'credentials' => [
                'key' => env('AWS_ACCESS_KEY_ID', ''),
                'secret' => env('AWS_SECRET_ACCESS_KEY', ''),
                // 'token' => '', // token is optional
            ]
        ],
        'retention' => 30,
        'level' => 'info',
        'group_name' => env('CLOUDWATCH_LOG_GROUP', 'group-log'),
        'stream_name' => env('CLOUDWATCH_LOG_STREAM', 'error-log'),
    ],
 ],

Vậy là xong tất cả các bước cấu hình rồi. Mình chuyển sang bước sử dụng

Bước 4: Sử dụng

Các bạn có thể cấu hình mặc định cho việc lưu logs là trên cloudwatch thì làm như sau:

LOG_CHANNEL=cloudwatch
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

Sau đó các bạn có thể tạo Route và test xem nó đã hoạt động được chưa thì có thể dùng lệnh sau:

logger("Save logs to cloudwatch success.");
Log::channel('cloudwatch')->error('This is an informational message.');

Bước 5: Kiểm tra logs trên cloudwatch.

Và đây là kết quả mà chúng ta nhận được.

Chúc các bạn thành công.

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday