apple-oslog-best-practiceslisted
Install: claude install-skill ttamakijp/dev-templates
# Skill: Apple `os.Logger` best practices
Apple unified logging (`os.Logger`) を使う iOS / macOS / watchOS / tvOS /
visionOS プロジェクトで、**privacy 修飾子 / subsystem 規約 / category 設計 /
log level 使い分け** を実装段階で組込むための skill。
[[ADR-0037]] rule scope policy により `os.Logger` の具体的な命名・設計規約は
rule ([[ios-quality]]) から本 skill へ切出された。[[ADR-0036]]
`--suggest-skills` mode が `import os` + `Logger` 使用検出時に提案する。
## When to invoke
- iOS / macOS 等のプロジェクトで `import os` + `Logger` を使う
- `.info` / `.debug` レベルが Console.app / `log show` で見えなくて困っている
(まず [[build-and-debug-ios]] の OS 仕様部分で観察フラグを確認、本 skill は
実装側の規約担当)
- subsystem / category の命名で迷う
- ADR-0036 `--suggest-skills` から提案を受けた
## 要件
- `os.Logger` の subsystem を `Bundle.main.bundleIdentifier` 由来 + fallback
1 段で定義す���
- privacy 修飾子 (`.public` / `.private` / `.sensitive`) を **必ず明示** する
- category を 1 ファイル 1 category 規約で管理し、grep / `log show
--predicate` の横断検索を容易にする
- log level の使い分け (`.notice` / `.info` / `.debug` / `.error` / `.fault`)
を adopter 内で一貫させる
## 手順
### Step 1: Logger extension の定義 (subsystem + category)
```swift
import os
extension Logger {
private static let subsystem = Bundle.main.bundleIdentifier ?? "<reverse-dns-fallback>"
static let app = Logger(subsystem: subsystem, category: "app")
static let ble = Logger(subsystem: subsystem, category: "ble")
static let playback = Logger(subsystem: subsystem, category: "playback")
static let network = Logger(subsystem: subsystem, category: "network")
static let pe