iOS 10から「Unified logging system」というログシステムが導入されていて、ログレベルや変数のプライバシー設定など様々な機能があるため、実際に活用するにあたり詳しい挙動を確認したかったため、その調査結果をメモしておく
調査環境
- Xcode 11.3.1
- iOS 13.3
調査内容
ログの種類
OSLog
に関しては5つのログレベルがあるため、従来のログ出力関数であるprint
・NSLog
と合わせて7種類を比較・調査する
import os.log
func outputVariousLogs() {
os_log("Log test: OSLog / Info", type: .info)
os_log("Log test: OSLog / Debug", type: .debug)
os_log("Log test: OSLog / Default", type: .default)
os_log("Log test: OSLog / Error", type: .error)
os_log("Log test: OSLog / Fault", type: .fault)
print("Log test: print")
NSLog("Log test: NSLog")
}
さらにOSLog
では、ログとして変数の中身を表示する場合、単純な型(Intなど)はデフォルトでそのまま見えるが、それ以外の複雑な型(Stringなど)はデフォルトでは見えない
そのため、複雑な型の中身を表示することを明示的に指定する書式%{Public}
があり、その書式の付与による可視性も比較・調査する
func outputSomeArgs(simpleArg: Int, complexArg: String) {
os_log("Log test: OSLog, embedded=%d", simpleArg)
os_log("Log test: OSLog, object=%s", complexArg)
os_log("Log test: OSLog, object(Public)=%{Public}s", complexArg)
}
ログの収集方法
以下の3つを比較・調査する
- Xcodeで「Run」した際に、画面下部に表示されるログ
- Console.appで表示されるログ(macにデフォルトで入っているログ収集アプリ)
- sysdiagnoseでアーカイブした時の、アーカイブ中に含まれる
*.logarchive
ファイルに保存されたログ
3のsysdiagnoseは、Appleへのバグレポートを提出する際に求められる場合がある、端末のログ収集方法である
詳しいやり方は、以下のページの「sysdiagnose for iOS」>「Instruction」に記載されている
https://developer.apple.com/bug-reporting/profiles-and-logs/
調査結果
ログ収集方法と収集できるログの種類
- XcodeによるRunは全てのログが見え、
print
はこの場合にしか見えない -
OSLog
のInfo
とDebug
のレベルはメモリ上に保持されるため、リアルタイムにログを表示するツール(XcodeとConsole.app)でしか見れない
ログの種類 | Xcode(Run) | Console.app | sysdiagnose |
---|---|---|---|
OSLog / Info | ○ | ○ | × |
OSLog / Debug | ○ | ○ | × |
OSLog / Default | ○ | ○ | ○ |
OSLog / Error | ○ | ○ | ○ |
OSLog / Fault | ○ | ○ | ○ |
○ | × | × | |
NSLog | ○ | ○ | ○ |
補足
- アプリのビルドに使う証明書の種類(Development/Distribution)で特に結果に違いはない
- Console.app で
Info
とDebug
のログをみる場合は、メニューの「アクション」から「情報メッセージを含める」と「デバッグメッセージを含める」をONにしておく必要がある
ログ収集方法と変数の閲覧可否
- XcodeによるRunは全ての変数が見える
- その他は、ドキュメントに記されている通り、複雑な型であれば明示的に
%{Public}
を指定しなければ見えない
引数の種別 | Xcode(Run) | Console.app | sysdiagnose |
---|---|---|---|
単純な型(Intなど) | ○ | ○ | ○ |
複雑な型(Stringなど)・Publicなし | ○ | × | × |
複雑な型(Stringなど)・Publicあり | ○ | ○ | ○ |
"×"の場合、<private>
と表示される
その他
-
OSLog
のログレベルInfo
の説明に「基本はメモリ上に格納されるが、障害やエラー発生時にはデータストアに保存される」という記述があったため、fatalError()
を意図的に発生させると静的なログ収集方法であるsysdiagnoseでも見えるのではと考えて試したが、特に変化はなかった - XcodeのRunは、一度プロセスが終了するなどして接続が切れると、再度メニューの「Debug」>「Attach to Process」で再接続してもログは見えないため、再度Runしなければならない