fotografde / logging
集成日志处理的常用方式。
3.0.1
2024-09-18 13:49 UTC
Requires
- php: ^8.2
- monolog/monolog: ^3.7.0
- open-telemetry/opentelemetry-logger-monolog: ^1.0
Requires (Dev)
- aws/aws-sdk-php: ^3.231
- guzzlehttp/guzzle: ^7.4
- illuminate/support: ^9.19
- symfony/config: ^6.1
- symfony/dependency-injection: ^6.1
- symfony/http-kernel: ^6.1
- vimeo/psalm: ^5.26.1
README
示例日志格式
{ "@timestamp": "2022-07-06T12:28:54.571699+00:00", "@version": 1, "timestamp": 1657110534571, "host": "maually/automatic defined host", "environment": "prod", "app": "ServiceName", "message": "Something happened", "context": { "hello": "people" }, "extra": { "system-id": "48446546" }, "level": 200, "level_name": "INFO", "channel": "security", "entity.name": "newrelic_defined", "entity.type": "newrelic_defined", "hostname": "newrelic_defined", "trace.id": "newrelic_defined", "span.id": "newrelic_defined" }
异常上下文
有时我们希望记录异常出现时或从其他地方获取的额外数据。在许多情况下,你需要添加额外的依赖项,即Logger。我们可以通过异常上下文来自动化这个过程。你可以创建自定义错误和规则,以从它们中提取上下文。请参阅ExceptionContext文件夹中的示例。
以下是一个Guzzle示例
class GuzzleRequestExceptionContext implements ExceptionContext { /** * @return array{message?: string} */ public function __invoke(RequestException $exception): array { if ($exception->getResponse() !== null && $exception->getResponse()->getBody() !== null) { return ['message' => $exception->getResponse()->getBody()->getContents()]; } return []; } }
!警告:它目前只与Symfony集成自动工作。如果你想,你总是可以为其他框架添加集成。
配置
Laravel
在 config/logging.php
文件的 channels
节中添加
'gotphoto' => [ 'driver' => 'custom', 'via' => new Gotphoto\Logging\Laravel\LaravelLoggerCreating, 'app_name' => 'ServiceName', 'channel' => 'app'(security/reauest/order), 'processors' => [new Monolog\Processor\ProcessorInterface()], //OPTIONAL 'level' => Monolog\Logger::INFO, //OPTIONAL 'stream_to' => 'php://stderr', //OPTIONAL ] 'security' => [ 'driver' => 'custom', 'via' => new Gotphoto\Logging\Laravel\LaravelLoggerCreating, 'app_name' => 'ServiceName', 'channel' => 'security', 'processors' => [new Monolog\Processor\ProcessorInterface()], //OPTIONAL 'exceptionContexts' => [ //OPTIONAL RequestException::class => [new GuzzleRequestExceptionContext()], AwsException::class => [new AwsExceptionContext()], ], //OPTIONAL 'level' => Monolog\Logger::INFO, //OPTIONAL 'stream_to' => 'php://stderr', //OPTIONAL ],
不要忘记在同一文件中将其中一个设置为默认值: 'default' => env('LOG_CHANNEL', 'gotphoto'),
Symfony
添加包 Gotphoto\Logging\Symfony\SymfonyLoggingBundle::class => ['all' => true],
;
添加配置 gotphoto_logging.yaml
symfony_logging: app_name: ServiceName
使monolog配置看起来像这样
<?php declare(strict_types=1); use Gotphoto\Logging\Formatter; use Gotphoto\Logging\OtelFormatter; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use Symfony\Config\MonologConfig; return static function (MonologConfig $monolog, ContainerConfigurator $containerConfigurator): void { $monolog->handler('newrelic') ->type('stream') ->path('php://stderr') ->formatter(Formatter::class) // log start from info messages (debug is lowest level) ->level('info'); $monolog->handler('otel') ->type('service') ->id(Handler::class) // log start from info messages (debug is lowest level) ->level('info'); };
其中最重要的部分是
NewRelic
->type('stream')
->path('php://stderr')
->formatter(Formatter::class)
Otel
->type('service')
->id(Handler::class)
异常上下文
在Symfony中自动工作。只需创建接口 Gotphoto\Logging\ExceptionContext\ExceptionContext
的实现并将其添加为服务(通常应该由 $services->load()
自动完成)。然后Symfony将自动开始为你使用它。