基本方針
print() は禁止。Logger(os.log)を使用する(CLAUDE.md準拠)。
共通設定
import OSLog
// すべて以下のサブシステム名で統一
private static let subsystem = "com.happyboy1002.RankingStadium"
カテゴリ一覧
| カテゴリ | 用途 | 使用箇所 |
Auth | 認証処理 | AuthViewModel |
AppleSignIn | Apple Sign In実装 | AppleSignInService |
Vote | 投票処理 | VoteService, VoteView |
Point | ポイント取引 | PointService |
Ranking | ランキング作成・取得 | RankingService |
StoreKit | 課金処理 | StoreKitService |
Notification | 通知処理 | NotificationService |
Follow | フォロー処理 | FollowService |
Feedback | フィードバック送信 | FeedbackService |
Report | 通報処理 | ReportService |
ChoiceRequests | 選択肢申請 | ChoiceRequestService |
Home | ホーム画面 | HomeViewModel |
MyPage | マイページ | MyPageViewModel |
DraftList | 下書き一覧 | DraftListView |
SetupProfile | 初期プロフィール設定 | SetupProfileView |
FeedbackView | フィードバック画面 | FeedbackView |
PaywallView | Paywall画面 | PaywallView |
QuizGate | クイズゲート | QuizGateView |
RankUp | ランクアップ演出 | RankUpCelebrationView |
ResultLocked | 結果ロック画面 | ResultLockedView |
使用例
private static let logger = Logger(
subsystem: "com.happyboy1002.RankingStadium",
category: "Vote"
)
// 通常イベント
logger.info("投票完了: rankingId=\(rankingId, privacy: .public)")
// 警告
logger.warning("既投票検出: ユーザーが再送信しました")
// エラー
logger.error("投票失敗: \(error.localizedDescription, privacy: .public)")
ログレベルの使い分け
| レベル | 用途 | 例 |
.debug | 開発時のみ確認したい情報 | VM初期化、画面遷移 |
.info | 通常のイベント | ログイン成功、投票完了、ポイント消費 |
.notice | 注目すべきイベント | 初回起動、サブスク購入 |
.warning | 異常だが継続可能 | RetryHelper再試行、Unique制約検出 |
.error | 機能継続不可 | Supabase通信失敗、StoreKit verification失敗 |
.critical | アプリ継続不可 | 未使用 |
プライバシー対応
Apple Sign In のIDトークン、Supabase Anon Key、ユーザーのメールアドレス等は 絶対にログ出力しない。
ログ出力する識別子(ユーザーID、ランキングID)は privacy: .public を明示。
// OK
logger.info("投票完了: userId=\(userId, privacy: .public)")
// NG(メールアドレス出力)
logger.info("ログイン: \(user.email)")
// OK(私的データ扱い)
logger.info("ログイン: \(user.email, privacy: .private)")
ログの確認方法
macOS の Console.app でデバイスを選択し、subsystem == com.happyboy1002.RankingStadium でフィルタすると当該アプリのログのみ確認可能。
変更履歴
| バージョン | 日付 | 変更内容 |
| 1.0 | 2026-05-09 | 初版作成(ソースコードからリバース) |