ロギングAPIのLoggerとos_log

ロギングAPIの歴史

2005年、AppleはMac OS X 10.4 TigerでApple System Logger (ASL) を導入した。同年のWWDC 2005 Session 510 Core OS Enhancements for BSD DevelopersではApple System Loggerに触れているらしいが資料が見当たらない。

2008年、iOS 2 (iPhone OS 2) ではロギングにNSLogを用いた。

2016年、Appleは Unified Logging System という新しいロギングのシステムと新しいロギングAPI os_log をiOS 10 SDKで提供するとWWDC 2016 Session 721 Unified Logging and Activity Tracingで発表した。それまでにロギングで使われていたNSLog, asl_log_message, syslogなどはレガシーAPIと扱われた。os_logを使う場合、import os.logが必要だ。

2020年、AppleはWWDC 2020のセッション Explore logging in SwiftLogger構造体を発表した。os_logと同様に Unified Logging System に書き込む。同セッションではLoggerを使うためにimport osをしている。

名前空間

iOS Swift Objective-C
os_log 10以降 import os.log #import <os/log.h>
Logger 14以降 import os なし

サンプル実装

サンプル実装としてボタン押下でログ出力するアプリを用意した。

XcodeでNew Project, App Playgroundを選択して、ContentView.swiftを次のコードに置き換える。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import SwiftUI
import os

struct ContentView: View {
    private let logger = Logger(subsystem: "com.hiroakit.AppPlayground1", category: "UI")

    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)

            Button("ログを出力") {
                logger.info("info: ボタンがタップされました")
                logger.log("log: ボタンがタップされました")
                logger.warning("warning: ボタンがタップされました")
                logger.error("error: ボタンがタップされました")
            }
            .padding()
        }
    }
}

ログ確認

コンソール.app

Loggerでログ出力をする場合、コンソール.app (以下、コンソール) でほぼリアルタイムでログを閲覧できる。

下図は上のサンプル実装で出力されたログをコンソールで確認している様子だ。サンプル実装ではLogger(subsystem:category:)の第一引数のsubsystemに com.hiroakit.AppPlayground1 と入力しているので、 サブシステム:com.hiroakit.AppPlayground1 とコンソールの検索バーに入力すると該当のログが表示される。

手順

  1. コンソールを起動する
  2. ログを確認したい端末を選択する (下図①)
  3. 「ストリーミングを開始」をクリックする (下図②)
  4. 検索バーにキーワードを入力する
    • 入力例 サブシステム:com.hiroakit.AppPlayground1

logコマンド

logコマンドがある。

1
2
which -a log
/usr/bin/log

logコマンド (log stream) ではiPhone実機のログをリアルタイムに閲覧できない。logコマンドを使う場合はlog collectコマンドでiPhoneに蓄積されているログをlogarchiveファイルにして閲覧する。

1
sudo log collect --device-name <name>

上のコマンドでsystem_logs.logarchiveファイルが作成される。このファイルをダブルクリックするとコンソールで閲覧できる。

logコマンドのエラー

sudoをつけないと次のエラーが発生する

log: Must be root to collect logs from attached device