[iOS] XcodeのRun起動でないときにログをみたい

2021.07.15

こんにちは。きんくまです。

XcodeでRunから起動するときは、Xcodeのコンソール上にデバッグの出力が表示されます。
print文で出るやつです。

今回アプリをアップデートした後の初回起動時の出力を確認したかったのですが、
BundleIDの関係でXcodeのRun起動での確認ができませんでした。

どうしたものかなー?と思って調べました。

参考URL

OSLogを利用したロギング
[iOS 10] OSLog でアプリログを出力する
Explore logging in Swiftの紹介 #WWDC20

LoggerとOSLogを使って出力

iOS 14以降 -> Loggerを利用
iOS 13以下 -> OSLogを利用

という振り分けになります。

出力クラスを作る

OSのバージョンごとに振り分けしつつ、文字列とIntを出力できるクラスを作りました。

class MyLogger {
    
    /// サブシステム名
    ///
    /// Console.appで検索しやすければOK
    static let subsystemName = "mylogger"
    
    /// ログのカテゴリ
    enum Category: String {
        case test
    }
    
    @available(iOS 14.0, *)
    static let logger = Logger(subsystem: subsystemName, category: Category.test.rawValue)
    
    /// iOS 13以下用
    static let oslog = OSLog(subsystem: subsystemName, category: Category.test.rawValue)
    
    /// 文字列を出力する
    ///
    /// Xcodeからのデバッグ立ち上げ(Run)でないときは <private> 表記になる
    static func log(_ message: String?) {
        guard let message = message else { return }
        if #available(iOS 14.0, *) {
            logger.log(level: .default, "\(message)")
        } else {
            os_log("%@", log: oslog, type: .default, message)
        }
    }
    
    /// 整数を出力する
    ///
    /// Xcodeからのデバッグ立ち上げ(Run)でないときもそのまま表示される
    static func log(_ num: Int) {
        if #available(iOS 14.0, *) {
            logger.log(level: .default, "\(num)")
        } else {
            os_log("%d", log: oslog, type: .default, num)
        }
    }
}

使い方

    @IBAction func didTapStringButton() {
        MyLogger.log("Hello world!")
    }
    
    @IBAction func didTapIntButton() {
        MyLogger.log(12345)
    }

確認してみる!

出力を確認してみます。
まずは、Console.appを立ち上げます。

たくさん文字が出力されているので、しぼりこみます

準備ができたので、Run接続。または、Runを切った状態でアプリをたちあげます。

こっちはSimulatorです。
Run接続を切った状態でも文字列がそのまま表示されていることがわかりました。

こっちはiPhone実機です。
Run接続されたときは、文字列が表示されますが、Run接続をきると見えなくなることがわかりました。
このとき、数値はそのまま見えています。ですので、起動時の処理を確認したいときは、数値で出力しておけば良いですね。(わかりにくいけど、、)

こんな感じに、やって起動時のフローを確認することができました。
(起動時は同時にいろいろ処理がおきるので、順番を確認したかった)

ではでは。