带有CloudWatch的AWS上Symfony应用中的PHP日志目标

时间:2019-02-01 17:19:21

标签: php symfony amazon-cloudwatch monolog

我有一个Symfony应用程序托管在AWS上的Docker上。对于日志记录,我使用AWS CloudWatch。

例如:数据库连接不能被建立。如果我使用默认的独白配置,我得到的错误文件中的 /project/var/log/prod.log 的。 当我将路径更改为 php:// stderr 时,我希望CloudWatch中出现相同的消息,但不会出现

我已修改的index.php用于测试的原因:

<?php
echo ini_get('error_log');
error_log('error_log');
file_put_contents('php://stderr', 'file_put_contents', FILE_APPEND);

输出为:/proc/self/fd/2(docker日志目标)

在CloudWatch中,我收到消息error_log,而不是file_put_contents

我不知道问题出在哪里。也许Symfony的应用程序配置错误。但是由于消息file_put_contents丢失-在没有Symfony的情况下运行-我不确定。

这是独白配置:

monolog:
    handlers:
        main:
            type: fingers_crossed
            action_level: error
            handler: nested
            excluded_404s:
                # regex: exclude all 404 errors from the logs
                - ^/
        nested:
            type: stream
#            path: "%kernel.logs_dir%/%kernel.environment%.log"
            path: "php://stderr"
            level: debug
        console:
            type: console
            process_psr_3_messages: false
            channels: ["!event", "!doctrine"]
        deprecation:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%.deprecations.log"
        deprecation_filter:
            type: filter
            handler: deprecation
            max_level: info
            channels: ["php"]

这是默认配置,但path: "php://stderr"行除外。

1 个答案:

答案 0 :(得分:0)

我设法通过以下方法将Symfony日志记录到CloudWatch:

使用此软件包:

composer require maxbanton/cwh:^1.0

然后在我的config/packages/prod/monolog.yaml

monolog:
    handlers:
        main:
            type: fingers_crossed
            action_level: error
            handler: grouped
            excluded_404s:
                # regex: exclude all 404 errors from the logs
                - ^/
        grouped:
            type: group
            members: [cloudwatch, nested]
        nested:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%.log"
            level: debug
        console:
            type: console
            process_psr_3_messages: false
            channels: ["!event", "!doctrine"]
        cloudwatch:
            type: service
            id: cloudwatch_handler
            level: error

然后在我的config/services.yaml

services:
    cloudwatch_client:
    class: Aws\CloudWatchLogs\CloudWatchLogsClient
    arguments:
        - credentials: { key: '%env(AWS_KEY)%', secret: '%env(AWS_SECRET)%' }
          region: '%env(AWS_REGION)%'
          version: "2014-03-28"

    cloudwatch_handler:
        class: Maxbanton\Cwh\Handler\CloudWatch
        arguments:
            - "@cloudwatch_client"
            - "symfony"              # groupName
            - "%kernel.environment%" # streamName
            - 30                     # retentionDays
            - 10000                  # logsInBatch
            - { mytag: "symfony" }   # tags
            - WARNING                # logLevel

然后,我必须确保已设置的API密钥在IAM中具有CloudWatch的权限,但之后它可以完美记录