Уніфіковане логування для PHP-проєктів на базі Monolog + Symfony Bundle:
- єдиний JSON-формат логів (
SchemaFormatterV1); - процесори для нормалізації повідомлень і trace-контексту;
- інтеграція з OpenTelemetry trace context;
- інвентаризація використання логерів через
logging:scan.
- Автоматичне застосування форматера до Monolog handlers (
setFormatterтам, де підтримується). - Автоматичне підключення вибраних процесорів до всіх Monolog loggers.
- Однакова структура подій у всіх сервісах (поля
timestamp,level,message,context,service,trace,version). - Опціонально: enrichment trace-контекстом з OpenTelemetry і заголовка
cf-ray.
- PHP:
^8.2 - Monolog:
^2.3 || ^3.0 - Symfony components:
symfony/http-kernel:^5.4 || ^6.4 || ^7.0symfony/config:^5.4 || ^6.4 || ^7.0
Додатково для logging:scan:
symfony/consolesymfony/dependency-injectionnikic/php-parser
composer require adheart/loggingЯкщо це не Symfony Runtime з Flex, переконайтесь, що бандл зареєстрований вручну в config/bundles.php:
<?php
return [
// ...
Adheart\Logging\LoggingBundle::class => ['all' => true],
];Створіть config/packages/logging.yaml:
logging:
processors:
- message_normalizer
integrations:
- otel_trace
formatter:
schema_version: '1.0.0'
service_name: 'billing-api'
service_version: '%env(string:RELEASE_ID)%'Після цього:
- на всі
monolog.logger*буде додано процесори; - на всі
monolog.handler*буде встановленоSchemaFormatterV1; - логи підуть у стандартизованому JSON.
- Очистіть/прогрійте контейнер:
php bin/console cache:clear- Згенеруйте тестовий лог із будь-якого місця в застосунку:
$logger->info('User logged in', ['user' => ['id' => '123']]);- Перевірте raw-рядок у stdout/file-handler: має бути валідний JSON з полями
serviceіversion.
message_normalizer→Adheart\Logging\Core\Processors\MessageNormalizerProcessortrace→Adheart\Logging\Core\Processors\TraceContextProcessor
otel→Adheart\Logging\Integration\OpenTelemetry\Trace\OpenTelemetryTraceContextProvidercf_ray→Adheart\Logging\Integration\OpenTelemetry\Trace\CfRayTraceContextProvider
otel_trace:- processors:
trace - trace_providers:
otel,cf_ray
- processors:
Можна підключати свої сервіси без форку пакета:
logging:
processors:
- custom_processor
integrations:
- custom_trace
aliases:
processors:
custom_processor: '@app.logging.processor.custom'
trace_providers:
app_provider: '@app.trace.provider'
integrations:
custom_trace:
processors: ['trace']
trace_providers: ['app_provider']Якщо встановлені dev-залежності для сканера, доступна команда:
php bin/console logging:scan --summaryПриклади:
php bin/console logging:scan --format=json --summary
php bin/console logging:scan --logger-name=app --severity-min=error
php bin/console logging:scan --path-prefix=src/Billing --exclude-path-prefix=src/Billing/Legacy
php bin/console logging:scan --list-loggers