基本方針

print() は禁止Logger(os.log)を使用する(CLAUDE.md準拠)。

共通設定

import OSLog

// すべて以下のサブシステム名で統一
private static let subsystem = "com.happyboy1002.RankingStadium"

カテゴリ一覧

カテゴリ用途使用箇所
Auth認証処理AuthViewModel
AppleSignInApple 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
PaywallViewPaywall画面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.02026-05-09初版作成(ソースコードからリバース)