
# Журналювання

Queuety записує кожну подію завдання та робочого процесу в таблицю бази даних `queuety_logs`. Файлів журналу немає. Усі записи можна переглядати через PHP API і CLI.

## Типи подій

Кожен запис журналу має тип події з переліку `LogEvent`:

| Подія | Опис |
|---|---|
| `started` | Виконання завдання розпочато |
| `completed` | Завдання успішно завершено |
| `failed` | Спроба завершилася винятком і буде повторена (для останньої спроби записується лише `buried`) |
| `buried` | Усі спроби повторного виконання завдання вичерпано |
| `retried` | Повторне виконання завдання заплановано |
| `workflow_started` | Робочий процес запущено |
| `workflow_completed` | Усі етапи робочого процесу завершено |
| `workflow_failed` | Етап робочого процесу остаточно завершився помилкою |
| `workflow_paused` | Робочий процес призупинено |
| `workflow_resumed` | Робочий процес відновлено |
| `workflow_cancelled` | Робочий процес скасовано |
| `workflow_rewound` | Робочий процес повернуто до попереднього етапу |
| `workflow_forked` | Робочий процес відгалужено в новий робочий процес |
| `workflow_deadline_exceeded` | Робочий процес пропустив крайній термін `must_complete_within()` |
| `debug` | Повідомлення рівня налагодження (коли увімкнено `QUEUETY_DEBUG`) |

## Поля журналу

Кожен запис журналу містить:

| Поле | Опис |
|---|---|
| `id` | Автоматично збільшуваний ID |
| `event` | Рядок типу події |
| `handler` | Назва обробника або клас |
| `job_id` | ID пов’язаного завдання (може бути null) |
| `workflow_id` | ID пов’язаного робочого процесу (може бути null) |
| `step_index` | Індекс етапу робочого процесу (може бути null) |
| `attempt` | Номер спроби |
| `duration_ms` | Тривалість виконання в мілісекундах |
| `error_message` | Повідомлення про помилку, якщо сталася помилка |
| `created_at` | Мітка часу |

## Запити до журналів через PHP

```php
$logger = Queuety::logger();

// Logs for a specific job
$logs = $logger->for_job( 42 );

// Logs for a specific workflow
$logs = $logger->for_workflow( 7 );

// Logs for a specific handler
$logs = $logger->for_handler( 'send_email', 50 );

// Logs for a specific event type
$logs = $logger->for_event( \Queuety\Enums\LogEvent::Failed, 50 );

// Logs since a datetime
$logs = $logger->since( new \DateTimeImmutable( '-1 hour' ), 100 );
```

## Запити до журналів через CLI

```bash
# Recent logs (last 24 hours)
wp queuety log

# Logs for a specific job
wp queuety log --job=42

# Logs for a specific workflow
wp queuety log --workflow=7

# Logs for a handler
wp queuety log --handler=send_email

# Logs for an event type
wp queuety log --event=failed

# Logs since a datetime
wp queuety log --since="2025-01-01 00:00:00"

# Custom limit and format
wp queuety log --limit=100 --format=json
```

## Зберігання журналів

Журнали зберігаються, доки ви їх не очистите. Константу `QUEUETY_LOG_RETENTION_DAYS` читає `Config::log_retention_days()`, але наразі її ніде не використовують, тому вона нічого не очищає ([#15](https://github.com/inline0/queuety/issues/15)). Підкоманду `wp queuety log purge` також неможливо викликати ([#11](https://github.com/inline0/queuety/issues/11)).

Очищайте журнали через PHP, наприклад за допомогою власного запланованого завдання або `wp eval`:

```php
$count = Queuety::logger()->purge( 30 );
```
