---
title: Log đầy đủ context khi xử lý lỗi
impact: HIGH
impactDescription: Thiếu context trong log làm mất khả năng correlate sự kiện, không tái hiện được lỗi production và tăng MTTR (Mean Time To Resolve).
tags: swift, ios, logging, error-handling, debugging, observability
---

## Log đầy đủ context khi xử lý lỗi

Khi log lỗi, phải bao gồm: định danh entity (userId, orderId), action đang thực hiện, loại lỗi cụ thể. Dùng `os.Logger` với privacy annotation để tránh log PII ra console.

**Incorrect (log thiếu context):**

```swift
private let logger = Logger()

func processPayment(_ payment: Payment) async {
    do {
        try await paymentService.charge(payment)
    } catch {
        logger.error("Payment failed")  // !! Không biết payment nào, tại sao?
    }
}

func syncUserData() async {
    do {
        try await syncService.fullSync()
    } catch {
        print("Sync error: \(error)")  // print thay vì logger, không có user context
    }
}
```

**Correct (log đầy đủ context với privacy):**

```swift
import OSLog

private let logger = Logger(subsystem: "com.app.payment", category: "Processing")

func processPayment(_ payment: Payment) async {
    do {
        try await paymentService.charge(payment)
        logger.info("Payment succeeded. paymentId=\(payment.id, privacy: .public), amount=\(payment.amount)")
    } catch PaymentError.insufficientFunds {
        // Lỗi business - warning
        logger.warning("Insufficient funds. paymentId=\(payment.id, privacy: .public), userId=\(payment.userId, privacy: .private)")
    } catch PaymentError.cardDeclined(let code) {
        logger.error("Card declined. paymentId=\(payment.id, privacy: .public), declineCode=\(code, privacy: .public)")
    } catch {
        // Lỗi không ngờ - error level với full context
        logger.error("Unexpected payment failure. paymentId=\(payment.id, privacy: .public), error=\(error.localizedDescription, privacy: .public)")
    }
}
```

**Privacy annotation cho os.Logger:**

| Annotation | Khi nào dùng |
|-----------|-------------|
| `.public` | ID kỹ thuật, error code (an toàn để log) |
| `.private` | Email, tên, phone (ẩn trong log, chỉ hiện khi debug) |
| `.sensitive` | Token, mật khẩu (luôn ẩn) |

**Tools:** `os.Logger` với Privacy API, Code Review

