我想知道如何在 lumen\laravel 应用程序中使用 google 云日志记录 库,有 一些 php 示例,但我想知道如何在该框架中以最佳方式实施。
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 兼容的记录器。
我发现在
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;
}
由于 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 确实有效,但它是您不需要的另一种依赖。没什么问题,但为什么不保持简单呢?
如果您使用的是旧版本,则可以编写自定义格式化程序来实现相同的目的。
就在几天前,我确实写了一篇关于它的文章。如果您想了解更多信息,欢迎阅读: https://jonassiewertsen.com/blog/laravel-logging-show-correct-severity-levels-on-the-google-cloud-platform
我正在使用 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
{
}
},
]
);
}
}