
# 로깅

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)).

예를 들어 자체 예약 작업이나 `wp eval`을 사용해 PHP에서 삭제하세요.

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