How to use google cloud logging at a lumen/laravel application

问题描述 投票:0回答:4

我想知道如何在 lumen\laravel 应用程序中使用 google 云日志记录 库,有 一些 php 示例,但我想知道如何在该框架中以最佳方式实施。

php laravel logging google-cloud-platform lumen
4个回答
5
投票

Lumen 似乎使用与 Laravel 相同的日志记录基础设施。默认情况下,它使用 Monolog,这是一个 PSR-3 兼容的日志库,但我认为以下代码也适用于使用 Google 云进行日志记录:

创建记录器工厂类:

class CreateGoogleCloudLogger {
    public function __invoke() {
       $logging = new LoggingClient([
          'projectId' => $projectId
       ]);
       return $logging->psrLogger('app');      
    }
}

更改您的

.env
文件:

LOG_CHANNEL=googlecloud

然后将其添加到您的

AppServiceProvider
注册功能中

config(['logging.channels.googlecloud' => [
    'driver' => 'custom',
    'via' => App\Logging\CreateGoogleCloudLogger::class,
] ]);

这应该使用工厂来创建一个 PSR-3 兼容的记录器。


1
投票

我发现在

stack
频道(这是 Laravel 9 的默认配置)中使用时,接受的答案对我不起作用。这似乎是由于堆栈通道需要 Monolog 记录器,而不仅仅是 PSR-3 记录器 为了完成这项工作,我复制了(或“从中汲取灵感”)https://github.com/einnar82/google-stack-driver

没有改变

app.php
.

.env
(注意你需要在这里设置你的实际值)

LOG_LEVEL=debug
LOG_CHANNELS=single,googlecloud
GOOGLE_PROJECT=my-project-name-from-google
GOOGLE_APPLICATION_CREDENTIALS=/var/www/somepath/credentials-file-from-google.json

logging.php

'googleProjectId' => env('GOOGLE_PROJECT'),
'channels' => [
    'stack' => [
        'driver' => 'stack',
        'channels' => explode(',', env('LOG_CHANNELS', 'single')),
        'ignore_exceptions' => false,
    ],

    'single' => [
        'driver' => 'single',
        'path' => storage_path('logs/laravel.log'),
        'level' => env('LOG_LEVEL', 'debug'),
    ],

    'googlecloud' => [
        'driver' => 'custom',
        'via' => \App\Logging\CreateGoogleCloudLogger::class,
        'level' => env('LOG_LEVEL', 'debug'),
    ],
];

app/Logging/CreateGoogleCloudLogger.php

namespace App\Logging;

use Google\Cloud\Logging\LoggingClient;
use Monolog\Handler\PsrHandler;
use Monolog\Logger;


class CreateGoogleCloudLogger
{
    public function __invoke(array $config)
    {
        $logName = config('app.name');
        $logging = new LoggingClient([
            'projectId' => config('logging.googleProjectId')
        ]);
        $psrLogger = $logging->psrLogger($logName);

        $handler = new PsrHandler($psrLogger);
        return new Logger($logName, [$handler]);
    }
}

然后在您的应用程序中,您可以随时做...

Log::debug('This is a log message');
try {
    $var = $this->doSomethingRisky();
} catch (\Exception $e) {
    Log::warning('The risky thing failed but we will carry on anyway', ['message' => $e->getMessage()]);
    $var = null;
}

0
投票

由于 Laravel 使用 Monolog Logger,您可以使用它。就在最近,Monolog 确实添加了对 Google Cloud 的支持。

下面的解释适用于 Laravel 和 Lumen。

这只是一个配置更改

您只需要更改一个配置设置。

像这样在 .env 文件中设置 GoogleCloudLoggingFormatter:

LOG_STDERR_FORMATTER=\Monolog\Formatter\GoogleCloudLoggingFormatter::class

或在您的

config/logging.php

中定义它
'stderr' => [
    'driver' => 'monolog',
    'level' => env('LOG_LEVEL', 'debug'),
    'handler' => StreamHandler::class,
    'formatter' => env('LOG_STDERR_FORMATTER', \Monolog\Formatter\GoogleCloudLoggingFormatter::class),
    'with' => [
        'stream' => 'php://stderr',
    ],
],

记得选择 stderr 日志记录通道。如果您喜欢不同的频道名称,也可以重命名它。

谷歌云日志包

Google Cloud Logging Package 确实有效,但它是您不需要的另一种依赖。没什么问题,但为什么不保持简单呢?

Monolog 支持 Google 从版本 >= 2.8.0 或 >= 3.2.0.

如果您使用的是旧版本,则可以编写自定义格式化程序来实现相同的目的。

您需要更多信息吗?

就在几天前,我确实写了一篇关于它的文章。如果您想了解更多信息,欢迎阅读: https://jonassiewertsen.com/blog/laravel-logging-show-correct-severity-levels-on-the-google-cloud-platform


0
投票

我正在使用 Laravel 10,上面的解决方案几乎是开箱即用的。我必须包装一个实现 Monolog\Handler\HandlerInterface 的类。

// config/logging.php
    'googlecloud' => [
        'driver' => 'custom',
        'level' => env('LOG_LEVEL', 'debug'),
        'via' => \App\Helpers\GoogleCloudLogger::class,
    ],

// app/helpers/GoogleCloudLogger.php
    <?php

namespace App\Helpers;

use Google\Cloud\Logging\LoggingClient;
use Google\Cloud\Logging\PsrLogger;
use Monolog\Logger;
use Monolog\LogRecord;
use Monolog\Handler\HandlerInterface;

class GoogleCloudLogger
{
    public function __invoke()
    {
        $logging = new LoggingClient([
           'projectId' => env('GOOGLE_PROJECT_ID', '')
        ]);

    $logger = $logging->psrLogger(config('app.name'), [
        'batchEnabled' => true,
    ]);

    return new Logger(
        config('app.name'),
        [
            new class ($logger) implements HandlerInterface {
                public function __construct(
                    public PsrLogger $logger
                ) {
                }

                public function isHandling(LogRecord $record): bool
                {
                    return true;
                }

                public function handle(LogRecord $record): bool
                {
                    $this->logger->log(
                        $record->level->name,
                        $record->message,
                        $record->context
                    );

                    return true;
                }

                public function handleBatch(array $records): void
                {
                    foreach ($records as $record) {
                        $this->handle($record);
                    }
                }

                public function close(): void
                {
                }
            },
        ]
    );
}

}

© www.soinside.com 2019 - 2024. All rights reserved.