はじめに
iOSのログは、古くから存在しますNSLogや、iOS14で導入されましたOSLogなどさまざまなものが存在します。 こういったログ収集はソフトウェア開発において重要な側面であり、開発者がアプリケーションの動作を理解します貴重な情報源です。 OSLogは、macOS、iOS、watchOS、tvOSのログ収集は様々な点で進化していますので、今後はOSLogを使っていきましたいと思っています。 そこで、OSLogの利点、実用的な使用法を理解しましょう。
Appleのリファレンス
https://developer.apple.com/documentation/os/oslog
OSLogsを理解する
最初に注意しておきましたいのは、アップルのOSLogにも、iOS10以降でサポートされましたものと、iOS14、iPadOS14でサポートされましたものがあります。 ここでは、iOS14、iPadOS14でサポートされましたOSLogsについて書いています。
アップルのOSLogは、アップルプラットフォーム全体のログメッセージを合理化し、一元化しますために設計されましたシステム全体のログインフラストラクチャでUnified Logging System(ULS)の一部です。要約すると、アップルのmacOS、iOS、watchOS、tvOSなどでデバイスが変わっても同様に使用できます。
OSLogsの主な利点
1. アップルが提供する統一されたログシステム OSLogはアップルが提供する統一されたログシステムのため、開発者が異なるソースからのログメッセージの統一されたストリームにアクセスすることを可能にし、 システムの動作について全体的な理解に役立ちます。
2. 高速かつ軽量 OSLogは非常に高速で軽量な設計がされており、ログ収集がシステムやアプリケーションのパフォーマンスに与えます影響を最小限に抑えます。 そのため、本番環境やリリースビルドに適しています。
3. プライバシーとセキュリティへの配慮 OSLogsは、Default、Info、Debug、Error、Faultといった異なるログレベルを導入し、開発者が機密情報を適切なレベルでログに記録できるようにしています。 これにより、特定のログエントリが、明示的に要求された場合にのみ表示されるようになります。
OSLogsを使ってみる
それでは、OSLogをアップルアプリケーションで使い始めますための手順を確認しますが、先にサンプルコードを見てみます。
import OSLog extension Logger { /// アプリを特定するユニークな識別子には、アプリ固有のバンドル識別子を設定します private static var subsystem = Bundle.main.bundleIdentifier! /// ビューサイクルをログに記録する static let viewCycle = Logger(subsystem: subsystem, category: "viewcycle") /// トラッキングとアナリティクスに関連するすべてのログを記録する static let statistics = Logger(subsystem: subsystem, category: "statistics") }
OSLogはインスタンスにはサブシステム名とカテゴリ名が必要です。 コンソール アプリ内のログをフィルター処理しますときに認識できます、サブシステムの一意の識別子としてバンドル識別子を使用しますことをお勧めします。 インスタンスの生成が完了しますと、さまざまなログレベルの方法のいずれかを使用してログを開始できます。
1. OSLogのインポート
Swiftのコードで OSLog
をインポートします。
import OSLog
2. OSLogオブジェクトの作成
OSLog
オブジェクトをサブシステム識別子でインスタンス化します。
サブシステム識別子は通常、アプリやフレームワークに固有の逆 DNS 形式の文字列です。
let log = OSLog(subsystem: "com.yourcompanyname.yourappname", category: "general")
3. ログの記録
OSLog
が提供するさまざまなログ収集機能を利用して、さまざまなレベルでメッセー ジをログに記録するします。
os_log("This is a default log message", log: log) os_log("An error occurred: %@", log: log, type: .error, error.localizedDescription)
OSLogsの高度な使い方
ログレベルと重大度
OSLogsのログレベルは、ログメッセージの重要度を表します。これは、開発者が重要度に基づいてログエントリを分類し、優先順位をつけるのに役立ちます。OSLogsを含むAppleのUnified Logging System (ULS)には、いくつかの標準的なログレベルがあります。
以下はその概要です。
1. Default
Defaultレベルは、一般的なメッセージに使用され、一般的に情報的なものです。
os_log("Application started successfully", log: log)
2. Info
Infoレベルは、アプリケーション・フローを追跡するのに有用な、より詳細な情報に使用されます。
os_log("Processing data: %@", log: log, type: .info, data)
3. Debug
Debugレベルは、開発やデバッグには役立つが、本番では詳細すぎるメッセージに使用されます。
os_log("Debugging information: %@", log: log, type: .debug, debugInfo)
4. Error
Errorレベルは、エラーが発生したことを示しますが、アプリケーションの動作に致命的なものではないものも含まれることがあります。
os_log("Error occurred: %@", log: log, type: .error, error.localizedDescription)
5. Fault
Faultレベルは、早急な対応が必要な重大なエラーに使用されます。 これらは、アプリケーションの不安定性につながる深刻な問題です。
os_log("Critical fault: %@", log: log, type: .fault, criticalError.localizedDescription)
ログメッセージの性質と重大性に基づいて、適切なログレベルを選択することができます。 この柔軟性により、特に開発、テスト、本番のような異なる環境において、効果的なログ収集の実践が可能になります。 また、動的なログのフィルタリングを支援し、ユーザーがニーズに基づいてログのレベルを調整できるようにします。
ログのフィルタリングについて
Unified Loggingシステムは、ユーザーが特定のサブシステムやカテゴリーに対するログ収集のレベルを調整できるように、動的なログ・フィルタリングをサポートします。 この機能は、特に本番環境において、収集されるログデータの量を微調整するのに役立ちます。
ログのメタデータをカスタマイズすることについて
カスタム・メタデータでログ・エントリーを拡張し、デバッグや分析時にログ・メッセージのコンテキストを簡単にトレースできるようにします。
os_log("Processing request", log: log, type: .debug, metadata: .dictionary(["RequestID": requestID]))
OSLogsの確認方法
収集されたOSLogsは、「Xcodeのコンソール」や「コンソールアプリ」から確認できます。
OSLogsの有効な利用について
以下の点に注意して、役にたつログ収集を行いましょう。
1. サブシステムとカテゴリーの定義を整理して必要なログを探しやすくする 意味のあるサブシステムとカテゴリー識別子を選択し、アプリケーションに関連するログエントリーの識別とフィルタリングを容易にします。
2. 機密データの慎重な取り扱いに注意する 機密情報をログに記録する際には注意が必要です。さまざまなログレベルを活用して、そのようなデータの可視性を制御し、本番環境でのビルドで機密情報を公開しないようにします。
3. 性能に影響しないように考慮する ログの詳細量とパフォーマンスへの影響のバランスをとる。アプリケーションの効率を損なうことなく、包括的なログ収集を目指しましょう。
まとめ
Apple公式のOSLogsは、OSレベルで統一されたログの一部として、Appleエコシステム全体の開発者に洗練された効率的なログ収集ソリューションを提供します。 OSLogを採用することで、デベロッパはアプリケーションの動作に関する貴重な洞察を得ることができ、デバッグプロセスを強化し、ログの詳細とシステムパフォーマンスのバランスを維持することができます。 OSLogsを活用することで、より堅牢で保守性の高いiOSやiPadOS、さらにはWatchOS、tvOSに対応したアプリを開発できます。 ぜひ技術選定、設計フェーズで検討して頂きたいと思います。