
# Ведение журналов

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` | Автоматически увеличиваемый идентификатор |
| `event` | Строка типа события |
| `handler` | Имя или класс обработчика |
| `job_id` | Идентификатор связанного задания (может быть пустым) |
| `workflow_id` | Идентификатор связанного рабочего процесса (может быть пустым) |
| `step_index` | Индекс этапа рабочего процесса (может быть пустым) |
| `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 );
```
