LoginSignup
14
19

More than 3 years have passed since last update.

iOSの各種ログ収集方法におけるOSLog等のログ出力関数によるログの可視性調査

Posted at

iOS 10から「Unified logging system」というログシステムが導入されていて、ログレベルや変数のプライバシー設定など様々な機能があるため、実際に活用するにあたり詳しい挙動を確認したかったため、その調査結果をメモしておく

調査環境

  • Xcode 11.3.1
  • iOS 13.3

調査内容

ログの種類

OSLogに関しては5つのログレベルがあるため、従来のログ出力関数であるprintNSLogと合わせて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つを比較・調査する
1. Xcodeで「Run」した際に、画面下部に表示されるログ
2. Console.appで表示されるログ(macにデフォルトで入っているログ収集アプリ)
3. sysdiagnoseでアーカイブした時の、アーカイブ中に含まれる*.logarchiveファイルに保存されたログ

3のsysdiagnoseは、Appleへのバグレポートを提出する際に求められる場合がある、端末のログ収集方法である
詳しいやり方は、以下のページの「sysdiagnose for iOS」>「Instruction」に記載されている
https://developer.apple.com/bug-reporting/profiles-and-logs/

調査結果

ログ収集方法と収集できるログの種類

  • XcodeによるRunは全てのログが見え、printはこの場合にしか見えない
  • OSLogInfoDebugのレベルはメモリ上に保持されるため、リアルタイムにログを表示するツール(XcodeとConsole.app)でしか見れない
ログの種類 Xcode(Run) Console.app sysdiagnose
OSLog / Info ×
OSLog / Debug ×
OSLog / Default
OSLog / Error
OSLog / Fault
print × ×
NSLog

補足

  • アプリのビルドに使う証明書の種類(Development/Distribution)で特に結果に違いはない
  • Console.app でInfoDebugのログをみる場合は、メニューの「アクション」から「情報メッセージを含める」と「デバッグメッセージを含める」をONにしておく必要がある Console_ログレベル設定.png

ログ収集方法と変数の閲覧可否

  • 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しなければならない

参考

14
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
19