Добавление меток в записи журнала GCP от GAE - PullRequest
0 голосов
/ 28 августа 2018

В настоящее время я использую Symfony 4 в среде Google App Engine Flex.

Я пытаюсь добавить дополнительные «метки» к своим записям в журнале, чтобы помочь с отладкой, я использую обработчик Stackdriver для регистрации событий, и я попытался добавить новые метки в обработчик Stackdriver, который отлично работает локально, но не работает при развертывании в GAE.

Моя главная цель - добавить идентификатор ко всем записям журнала, чтобы помочь группировать записи по исполнению.

Может кто-нибудь сказать мне, почему метки из моего обработчика Stackdriver не передаются в лог?

Записи журнала из экземпляра GAE имеют только метки, такие как:

labels: {
  appengine.googleapis.com/trace_id:  "58a54e17ef1110b2720f0b103033187d"   
 }

monolog.yaml

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"
            level: debug
        console:
            type:   console
            process_psr_3_messages: false
            channels: ["!event", "!doctrine"]
        stackdriver:
            type: service
            id:   stackdriver_handler
            level: debug

StackdriverHandler.php

<?php

namespace App\Bundle\Monolog;

use Google\Cloud\Logging\LoggingClient;
use Monolog\Handler\PsrHandler;
use Monolog\Logger;
use Psr\Log\LoggerInterface;

class StackdriverHandler extends PsrHandler
{
    /**
     * @var LoggerInterface[]
     */
    protected $loggers;

    /**
     * @var LoggingClient
     */
    protected $client;

    /**
     * @var string
     */
    protected $name;

    /**
     * @var string
     */
    protected $transactionId;

    /**
     * StackdriverHandler constructor.
     *
     * @param string          $projectId
     * @param string          $name
     * @param bool|int        $level
     * @param bool            $bubble
     */
    public function __construct($projectId, $name, $level = Logger::DEBUG, $bubble = true)
    {
        $this->client = new LoggingClient(
            [
                'projectId' => $projectId,
            ]
        );
        $this->name   = $name;
        $this->level  = $level;
        $this->bubble = $bubble;
    }

    /**
     * {@inheritdoc}
     */
    public function handle(array $record)
    {
        if (!$this->isHandling($record)) {
            return false;
        }

        $this->getLogger($record['channel'])->log(strtolower($record['level_name']), $record['message'], $record['context']);

        return false === $this->bubble;
    }

    /**
     * @param $channel
     *
     * @return LoggerInterface
     */
    protected function getLogger($channel)
    {
        if (!isset($this->loggers[$channel]))
        {
            $params = ['labels' => ['context' => $channel, 'transaction_id'=> $this->transactionId] ];
            $this->loggers[$channel] = $this->client->psrLogger($this->name, $params);
        }

        return $this->loggers[$channel];
    }
}

1 Ответ

0 голосов
/ 22 апреля 2019

Вы можете напрямую читать / записывать записи журналов, используя Stackdriver Client Libraries . Клиентская библиотека поддерживает добавление пользовательских меток к записям, что может быть достигнуто следующим образом:

# Write a log entry
entry = logging.entry
entry.payload = "Job started."
entry.log_name = "my_app_log"
entry.resource.type = "gae_app"
entry.resource.labels[:module_id] = "1"
entry.resource.labels[:version_id] = "20150925t173233"

...