Логирование и диагностика
CDO логирует каждый порождённый запрос через PSR-3 логгер и предоставляет лёгкие проверки здоровья у каждого конфига. Это руководство показывает, как подключить логгер, читать debug-вывод, зондировать доступность и восстанавливать устаревшее соединение.
Подключите PSR-3 логгер
Каждый конфиг стартует с NullLogger (молчит). Предоставьте свой логгер — и CDO
запишет каждый построенный запрос на уровне debug.
Подключите его при первом создании конфига пулом:
use Flytachi\Winter\Cdo\ConnectionPool;
use App\Db\AppDb;
// $logger — любой Psr\Log\LoggerInterface
ConnectionPool::getConfigDb(AppDb::class, $logger);
$cdo = ConnectionPool::db(AppDb::class);Или задайте его прямо на экземпляре конфига:
$config = ConnectionPool::getConfigDb(AppDb::class);
$config->setLogger($logger);Подключайте логгер до соединения
Логгер передаётся CDO при открытии соединения. Задайте его до первого
вызова connect() / db() — ConnectionPool::getConfigDb() игнорирует аргумент
$logger при каждом вызове после того, как конфиг закеширован.
Что логируется
Каждый метод DML логирует порождённый SQL на уровне debug с префиксом операции:
| Префикс | Метод |
|---|---|
insert: |
insert() |
insert group: |
insertGroup() (на каждый чанк) |
upsert: |
upsert() |
insert or update group: |
upsertGroup() (на каждый чанк) |
update: |
update() |
delete: |
delete() |
Логируемая строка — это запрос с его :плейсхолдерами, а не привязанные значения,
поэтому debug-логи никогда не утекают сами данные.
Проверки здоровья
Каждый конфиг предлагает два зонда, оба выполняют SELECT 1:
$config = ConnectionPool::getConfigDb(AppDb::class);
$config->ping(); // bool — доступна?
$config->pingDetail(); // ['status' => bool, 'latency' => float|null (мс), 'error' => string|null]Используйте ping() для проверки готовности и pingDetail(), когда нужна
задержка или сообщение об ошибке для эндпоинта статуса.
Восстановление устаревшего соединения
Соединения могут устаревать после долгого простоя или тайм-аута на стороне сервера. Конфиг предоставляет полный жизненный цикл:
$config = ConnectionPool::getConfigDb(AppDb::class);
$config->disconnect(); // освободить ссылку на CDO
$config->connect(); // лениво переоткрыть
$config->reconnect(); // disconnect + connect одним вызовомЧастый приём — повторить один раз при сбое:
use Flytachi\Winter\Cdo\Connection\CDOException;
try {
$id = ConnectionPool::db(AppDb::class)->insert('events', $event);
} catch (CDOException $e) {
ConnectionPool::getConfigDb(AppDb::class)->reconnect();
$id = ConnectionPool::db(AppDb::class)->insert('events', $event);
}Связанное
- Конфигурация — логгер, ping и методы жизненного цикла
- Обработка ошибок — перехват и разбор сбоев
- Пул соединений — как кешируются конфиги