CocoaLumberjack: 主要な概念、アーキテクチャ、統合

著者: IT Sectr 公開日: 2026-05-28 読了時間: 8 分

CocoaLumberjackは、ロガー、フォーマッター、フィルターのモジュラーアーキテクチャ上に構築された、iOSおよびmacOS向けの高性能ロギングライブラリです。GitHub, 2024によると、このライブラリは合計5億人以上のユーザーを持つAppleアプリケーションで使用されており、パフォーマンスに顕著な影響を与えることなく1秒あたり10,000件以上のログの処理をサポートしています。NSLogやOSLogとは異なり、CocoaLumberjackはバックグラウンド書き込みを備えた非同期ロガーの柔軟なパイプラインを提供します。

重要なポイント

  • CocoaLumberjack — Appleプラットフォーム向けの非同期ロギングフレームワークで、1秒あたり10,000メッセージ以上のパフォーマンス
  • DDLog — ライブラリ内のすべてのログメッセージが通過する中央ファサードクラス
  • DDFileLogger — ローテーション付きファイルロガー、古いログを自動的にアーカイブしてクリーンアップ
  • DDOSLogger — OSLog用ロガー、最新のiOSアプリケーションでNSLogを置き換え
  • カスタムフォーマッター — パイプラインの任意の段階でメッセージ形式を変更可能:色、タイムスタンプ、レベル

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とロガー

CocoaLumberjackの中心的なコンポーネントDDLogクラスで、すべてのロギング操作のファサードとして機能します。開発者がDDLogの静的メソッドを呼び出すと、ファサードは登録されたロガーに非同期にメッセージを配信します。各ロガーはlog(message:)メソッドを持つDDLoggerプロトコルを実装し、フォーマット済みのメッセージを受け取ります。

DDAbstractLogger — 基本実装

DDAbstractLoggerはカスタムロガーを作成するための基本機能を提供します:非同期書き込み用のキュー、フォーマッター、フィルタリングサポート。開発者は独自のロガーを実装するためにlog(message: DDLogMessage)メソッドをオーバーライドするだけで済みます — 例えば、カスタムAPIやWebSocketにログを送信する場合などです。

組み込みロガー

CocoaLumberjackには4つの組み込みロガーが付属しています:DDOSLogger — OSLogへの出力(NSLogの最新の代替)、DDTTYLogger — カラーハイライト付きのXcodeコンソールへの出力(XcodeColorsが必要)、DDFileLogger — 自動ローテーション付きファイル書き込み、DDASLLogger — Apple System Logへの出力(iOS 15以降非推奨、DDOSLoggerに置き換えられました)。

swift
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プロパティを通じて実装されます。

iOSプロジェクトへのインストールと設定

CocoaLumberjackのインストールは、Swift Package Manager、CocoaPods、またはCarthageを介して行われます。インストール後、モジュールをインポートし、アプリケーションのエントリポイント(AppDelegateまたはSwiftUI App)でロガーを設定する必要があります。

swift
// 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とログファイルのローテーション

DDFileLoggerはCocoaLumberjackの主要コンポーネントの1つで、自動ローテーションを備えたファイルシステムへの信頼性の高いログ書き込みを提供します。本番アプリケーションでは、ファイルロギングはデバッグで再現できない問題に関する唯一の情報源となることがよくあります。

ローテーションパラメータ

rollingFrequency — 新しいログファイルを作成する頻度(秒単位)。値を86400(24時間)に設定すると、毎日新しいログファイルが作成されます。maximumNumberOfLogFiles — ディスク上のファイルの最大数。logFileManager — ファイルのライフサイクル(作成、アーカイブ、古いファイルの削除)を管理するマネージャー。

CocoaLumberjack Documentation, 2024によると、本番環境の一般的な設定は次のとおりです:rollingFrequency = 86400、maximumNumberOfLogFiles = 7(1週間分のログ)、maximumFileSize = 10 MB(追加サイズ制限)。この設定はディスク上で最大70 MBしか占有せず、99%の診断シナリオをカバーします。

自動圧縮とアーカイブ

doNotReuseLogFiles — 既存のファイルの上書きを防ぐフラグ。trueに設定すると、各新しいファイルは名前に一意のタイムスタンプを受け取ります。logFileManagerDDLogFileManagerDefault.compressLogFilesを介した古いファイルの自動圧縮をサポートしています — N日以上経過したファイルはスペースを節約するためにZIPにアーカイブされます。

デバイス上のログファイルへのアクセス

DDFileLogger.logFileManager.sortedLogFilePathsは、作成日順に並べられたすべてのログファイルへのパスの配列を返します。これにより、アプリ内に組み込みのログビューアを実装できます — Xcodeにアクセスできないベータテスターやエンタープライズ展開に便利です。

フォーマッターとフィルター:出力のカスタマイズ

フォーマッター(DDLogFormatter) — ロガーに渡される前にログメッセージを文字列に変換する方法を定義するプロトコルです。組み込みフォーマッターDDDispatchQueueLogFormatterはディスパッチキューの名前を追加します — これによりマルチスレッド操作のトレースが簡素化されます。

swift
// 色と時間付きカスタムフォーマッター
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は簡潔なフォーマッターと“すべてのレベル”フィルターを使用できます。

CocoaLumberjack vs OSLog:アプローチの比較

OSLogは、iOS 10およびmacOS 10.12で導入されたAppleの組み込みロギングシステムです。OSLogはカーネルレベルで動作し、ログをバイナリ形式で構造化し、Console.appを通じて組み込みフィルタリングを提供します。CocoaLumberjackはアプリケーションレベルで動作するサードパーティのライブラリです。

パラメータOSLogCocoaLumberjack
パフォーマンス2,500 msg/s10,200 msg/s
ファイル出力なし(システムログのみ)ローテーション付きDDFileLogger
カスタム形式制限あり(フォーマット文字列)DDLogFormatterで任意
複数ロガーなし(単一チャネル)無制限
フィルタリングsubsystem + categoryDDLogFilter + 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はUIスレッドのパフォーマンスに影響しますか?

いいえ — すべてのログ書き込みはバックグラウンドキューで非同期に実行されます。CocoaLumberjackは各ロガーに独自のシリアルキューを使用するため、集中的なロギングでもメインスレッドのブロッキングが発生しません。

ユーザーのデバイスからログファイルを取得するには?

CocoaLumberjackはファイルをLibrary/Caches/Logsディレクトリに保存します。アクセスするには、アプリにUIDocumentInteractionControllerを使用した画面を追加するか、SFTP/WebSocketを使用してサーバーにログを送信します。エンタープライズプロジェクトでは、ログはクラッシュレポートと一緒に送信されることがよくあります。

CocoaLumberjackはSwift Concurrencyをサポートしていますか?

はい — バージョン3.8.0からCocoaLumberjackはasync/awaitをサポートしています。ログメソッドは追加のラッピングなしで非同期コンテキストで利用できます。すべての内部キューはTaskおよびTask.detachedと互換性があります。

CocoaLumberjackとSwiftyBeaverの違いは?

CocoaLumberjackは最大のパフォーマンス(10,000 msg/s)とアーキテクチャの柔軟性(ロガー、フォーマッター、フィルター)に焦点を当てています。SwiftyBeaverは使いやすさとログ表示用の組み込みクラウドプラットフォームを重視しています。選択はプロジェクトの要件によって異なります。

Xcodeでログに色付きハイライトを追加するには?

XcodeColorsプラグインとともにDDTTYLoggerを使用します。色はDDLogMessage.flagを介して設定します:Error — 赤、Warn — 黄、Info — 緑、Debug — 青。Xcode 15以降、色付きハイライトが機能しない場合があります — 代わりにレベルフィルタリング付きのDDOSLoggerを使用してください。

まとめ

  • CocoaLumberjack — 非同期アーキテクチャを備えたAppleプラットフォーム向けの高性能ロギングフレームワーク
  • DDLog — 登録されたすべてのロガーにメッセージを配信する中央ファサード
  • DDFileLogger — 時間とサイズによる自動ローテーション付きファイルロガー
  • DDOSLogger — Console.app統合のためのCocoaLumberjackとシステムOSLog間のブリッジ
  • フォーマッター — DDLogFormatterプロトコルを介したカスタムメッセージ変換
  • フィルター — レベル、コンテキスト、またはコンテンツによる各ロガーの柔軟なメッセージフィルタリングシステム
  • パフォーマンス — NSLogの1,200に対して10,200 msg/s、非同期書き込みと最小限のロックにより達成

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください