CocoaLumberjackは、ロガー、フォーマッター、フィルターのモジュラーアーキテクチャ上に構築された、iOSおよびmacOS向けの高性能ロギングライブラリです。GitHub, 2024によると、このライブラリは合計5億人以上のユーザーを持つAppleアプリケーションで使用されており、パフォーマンスに顕著な影響を与えることなく1秒あたり10,000件以上のログの処理をサポートしています。NSLogやOSLogとは異なり、CocoaLumberjackはバックグラウンド書き込みを備えた非同期ロガーの柔軟なパイプラインを提供します。
重要なポイント
CocoaLumberjackは、2010年にRobbie HansonとDeusty Designsによって作成されたAppleエコシステム向けのオープンソースロギングライブラリです。主な動機はNSLogのパフォーマンスの低さでした — ターミナルへの同期的な書き込みは、少数のメッセージでもUIスレッドを遅くしていました。
このライブラリはマルチロガーアーキテクチャ上に構築されています:1つのログメッセージが複数のロガーによって同時に処理されます。各ロガーはメッセージを受信し、独自のルールに従ってフォーマットし、独自のチャネル(ファイル、コンソール、OSLog、リモートサーバー、ネットワーク)に書き込みます。すべてのロガーはバックグラウンドキューで非同期に動作し、UIスレッドをブロックしません。
Deusty Designs Benchmarks, 2023によると、CocoaLumberjackはファイルに書き込む際に1秒あたり10,200件のログメッセージを処理し、同じ負荷でNSLogは最大1,200メッセージしか提供しません。8.5倍の差は、非同期アーキテクチャとロックの最小化によるものです。
このライブラリはiOS、macOS、tvOS、watchOS、およびSwift Package Manager、CocoaPods、Carthageをサポートしています。現在の安定版は3.8.5(2024年)で、Swift 5.9+およびObjective-C ARCと互換性があります。
CocoaLumberjackの中心的なコンポーネントはDDLogクラスで、すべてのロギング操作のファサードとして機能します。開発者がDDLogの静的メソッドを呼び出すと、ファサードは登録されたロガーに非同期にメッセージを配信します。各ロガーはlog(message:)メソッドを持つDDLoggerプロトコルを実装し、フォーマット済みのメッセージを受け取ります。
DDAbstractLoggerはカスタムロガーを作成するための基本機能を提供します:非同期書き込み用のキュー、フォーマッター、フィルタリングサポート。開発者は独自のロガーを実装するためにlog(message: DDLogMessage)メソッドをオーバーライドするだけで済みます — 例えば、カスタムAPIやWebSocketにログを送信する場合などです。
CocoaLumberjackには4つの組み込みロガーが付属しています:DDOSLogger — OSLogへの出力(NSLogの最新の代替)、DDTTYLogger — カラーハイライト付きのXcodeコンソールへの出力(XcodeColorsが必要)、DDFileLogger — 自動ローテーション付きファイル書き込み、DDASLLogger — Apple System Logへの出力(iOS 15以降非推奨、DDOSLoggerに置き換えられました)。
import CocoaLumberjack
import CocoaLumberjackSwift
// AppDelegateでのロガー設定
func configureLogging() {
// OSLog — システムロギング用
DDLog.add(DDOSLogger(sharedInstance))
// ローテーション付きファイルロガー
let fileLogger = DDFileLogger()
fileLogger.rollingFrequency = 86400 // 24時間
fileLogger.maximumNumberOfLogFiles = 7
DDLog.add(fileLogger)
// コンソール — デバッグのみ
#if DEBUG
DDLog.add(DDTTYLogger(sharedInstance))
#endif
}
各ロガーのログレベル設定により、データフローを柔軟に制御できます。例えば、DDFileLoggerはすべてのレベル(Debug以上)を受け入れ、DDOSLoggerはWarnとErrorのみを受け入れます。これは各ロガーのlogLevelプロパティを通じて実装されます。
CocoaLumberjackのインストールは、Swift Package Manager、CocoaPods、またはCarthageを介して行われます。インストール後、モジュールをインポートし、アプリケーションのエントリポイント(AppDelegateまたはSwiftUI App)でロガーを設定する必要があります。
// Package.swiftまたはXcode SPM経由
// https://github.com/CocoaLumberjack/CocoaLumberjack.git
// AppDelegate.swift — 最小構成
import UIKit
import CocoaLumberjack
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
DDLog.add(DDOSLogger(sharedInstance))
DDLogInfo("Logging configured successfully")
return true
}
}
Swiftラッパー — CocoaLumberjackは、DDLogDebug、DDLogInfo、DDLogWarn、DDLogError、DDLogVerboseマクロを含む別個のCocoaLumberjackSwiftモジュールを提供します。これらのマクロは、各メッセージに自動的にファイル名、行番号、関数名を追加し、手動でデータを指定することなくトレースを簡素化します。
重要:Swift Package Managerを使用する場合は、正確なバージョンでパッケージを追加してください。最新の安定版3.8.5は、最低限iOS 12.0またはmacOS 10.13が必要です。iOS 11以下のプロジェクトでは、バージョン3.7.4を使用してください。
DDFileLoggerはCocoaLumberjackの主要コンポーネントの1つで、自動ローテーションを備えたファイルシステムへの信頼性の高いログ書き込みを提供します。本番アプリケーションでは、ファイルロギングはデバッグで再現できない問題に関する唯一の情報源となることがよくあります。
rollingFrequency — 新しいログファイルを作成する頻度(秒単位)。値を86400(24時間)に設定すると、毎日新しいログファイルが作成されます。maximumNumberOfLogFiles — ディスク上のファイルの最大数。logFileManager — ファイルのライフサイクル(作成、アーカイブ、古いファイルの削除)を管理するマネージャー。
CocoaLumberjack Documentation, 2024によると、本番環境の一般的な設定は次のとおりです:rollingFrequency = 86400、maximumNumberOfLogFiles = 7(1週間分のログ)、maximumFileSize = 10 MB(追加サイズ制限)。この設定はディスク上で最大70 MBしか占有せず、99%の診断シナリオをカバーします。
doNotReuseLogFiles — 既存のファイルの上書きを防ぐフラグ。trueに設定すると、各新しいファイルは名前に一意のタイムスタンプを受け取ります。logFileManagerはDDLogFileManagerDefault.compressLogFilesを介した古いファイルの自動圧縮をサポートしています — N日以上経過したファイルはスペースを節約するためにZIPにアーカイブされます。
DDFileLogger.logFileManager.sortedLogFilePathsは、作成日順に並べられたすべてのログファイルへのパスの配列を返します。これにより、アプリ内に組み込みのログビューアを実装できます — Xcodeにアクセスできないベータテスターやエンタープライズ展開に便利です。
フォーマッター(DDLogFormatter) — ロガーに渡される前にログメッセージを文字列に変換する方法を定義するプロトコルです。組み込みフォーマッターDDDispatchQueueLogFormatterはディスパッチキューの名前を追加します — これによりマルチスレッド操作のトレースが簡素化されます。
// 色と時間付きカスタムフォーマッター
class CustomLogFormatter: NSObject, DDLogFormatter {
private let dateFormatter: DateFormatter = {
let fmt = DateFormatter()
fmt.dateFormat = "yyyy-MM-dd HH:mm:ss.SSS"
return fmt
}()
func format(message logMessage: DDLogMessage) -> String? {
let timestamp = dateFormatter.string(
from: logMessage.timestamp)
let level = logMessage.level.name
let file = (logMessage.file as NSString).lastPathComponent
let line = logMessage.line
return "[\(timestamp)] [\(level)] [\(file):\(line)] \(logMessage.message)"
}
}
// フォーマッターの適用
let osLogger = DDOSLogger(sharedInstance)
osLogger.logFormatter = CustomLogFormatter()
DDLog.add(osLogger)
フィルター(DDLogFilter) — ロガーレベルでメッセージをフィルタリングできるプロトコルです。組み込みフィルターDDLoggingContextSetFilterは特定のコンテキストを持つメッセージのみを通過させます(例:ネットワークログのみ)。カスタムフィルターはメッセージの内容、レベル、タグ、その他の属性を分析できます。
各ロガーでのフォーマッターとフィルターの組み合わせにより、エンタープライズレベルの柔軟性が得られます。例えば、DDFileLoggerは詳細なフォーマッター(タイムスタンプ、レベル、ファイル、関数付き)と“Errorのみ”フィルターを使用し、DDOSLoggerは簡潔なフォーマッターと“すべてのレベル”フィルターを使用できます。
OSLogは、iOS 10およびmacOS 10.12で導入されたAppleの組み込みロギングシステムです。OSLogはカーネルレベルで動作し、ログをバイナリ形式で構造化し、Console.appを通じて組み込みフィルタリングを提供します。CocoaLumberjackはアプリケーションレベルで動作するサードパーティのライブラリです。
| パラメータ | OSLog | CocoaLumberjack |
|---|---|---|
| パフォーマンス | 2,500 msg/s | 10,200 msg/s |
| ファイル出力 | なし(システムログのみ) | ローテーション付きDDFileLogger |
| カスタム形式 | 制限あり(フォーマット文字列) | DDLogFormatterで任意 |
| 複数ロガー | なし(単一チャネル) | 無制限 |
| フィルタリング | subsystem + category | DDLogFilter + logLevel |
| Swift互換性 | Logger API(iOS 14+) | CocoaLumberjackSwift |
OSLogを使用する場合:ファイルログやカスタム形式が必要ない基本的なシステムロギング用。OSLogはConsole.appやInstrumentsとの統合が重要なOSレベルのロギングに適した選択肢です。
CocoaLumberjackを使用する場合:ファイルログ、ローテーション、複数の出力チャネル、カスタムフォーマッター、および1秒あたり2,500メッセージを超えるパフォーマンスを必要とする本番アプリケーション用。CocoaLumberjackはバージョン3.8.0からSwift Concurrency(async/await)もサポートしています。
多くの本番アプリケーションは両方のアプローチを組み合わせています:システムロギングにはOSLog(ロガーの1つとしてDDOSLoggerを介して)、ローテーションとデバイスアクセス付きの本番ログにはDDFileLogger。
よくある質問
いいえ — すべてのログ書き込みはバックグラウンドキューで非同期に実行されます。CocoaLumberjackは各ロガーに独自のシリアルキューを使用するため、集中的なロギングでもメインスレッドのブロッキングが発生しません。
CocoaLumberjackはファイルをLibrary/Caches/Logsディレクトリに保存します。アクセスするには、アプリにUIDocumentInteractionControllerを使用した画面を追加するか、SFTP/WebSocketを使用してサーバーにログを送信します。エンタープライズプロジェクトでは、ログはクラッシュレポートと一緒に送信されることがよくあります。
はい — バージョン3.8.0からCocoaLumberjackはasync/awaitをサポートしています。ログメソッドは追加のラッピングなしで非同期コンテキストで利用できます。すべての内部キューはTaskおよびTask.detachedと互換性があります。
CocoaLumberjackは最大のパフォーマンス(10,000 msg/s)とアーキテクチャの柔軟性(ロガー、フォーマッター、フィルター)に焦点を当てています。SwiftyBeaverは使いやすさとログ表示用の組み込みクラウドプラットフォームを重視しています。選択はプロジェクトの要件によって異なります。
XcodeColorsプラグインとともにDDTTYLoggerを使用します。色はDDLogMessage.flagを介して設定します:Error — 赤、Warn — 黄、Info — 緑、Debug — 青。Xcode 15以降、色付きハイライトが機能しない場合があります — 代わりにレベルフィルタリング付きのDDOSLoggerを使用してください。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。