iOS ログ収集
Dash が新機能を発表!インシデントマネジメント、Continuous Profiler など多数の機能が追加されました! Dash イベントで発表された新機能!

iOS ログ収集

Datadog の dd-sdk-ios クライアント側ロギングライブラリを使用すると、iOS アプリケーションから Datadog へログを送信すると共に、次の機能を利用できます。

  • Datadog に JSON 形式でネイティブに記録する。
  • デフォルトを使用し、送信される各ログにカスタム属性を追加する。
  • 実際のクライアント IP アドレスとユーザーエージェントを記録する。
  • 自動一括ポストによって最適化されたネットワークの利用を活用します。

注意: dd-sdk-ios ライブラリは iOS 11 以降のすべてのバージョンに対応しています。

セットアップ

  1. パッケージマネージャーに応じてライブラリを依存関係として宣言します。

    CocoaPods を使用して、 dd-sdk-iosをインストールできます。

    pod 'DatadogSDK'

    Apple の Swift Package Manager を使用して統合するには、Package.swift に以下を依存関係として追加します。

    .package(url: "https://github.com/Datadog/dd-sdk-ios.git", .upToNextMajor(from: "1.0.0"))

    Carthage を使用して、 dd-sdk-iosをインストールできます。

    github "DataDog/dd-sdk-ios"
  2. アプリケーションコンテキストと Datadog クライアントトークンでライブラリを初期化します。セキュリティ上の理由から、クライアントトークンを使用する必要があります。API キーがクライアント側の iOS アプリケーションの IPA バイトコードで公開されてしまうため、Datadog API キーを使用して dd-sdk-ios ライブラリを構成することはできません。クライアントトークンの設定に関する詳細は、クライアントトークンに関するドキュメントを参照してください。

    Datadog.initialize(
        appContext: .init(),
        configuration: Datadog.Configuration
            .builderUsing(clientToken: "<client_token>", environment: "<environment_name>")
            .set(serviceName: "app-name")
            .build()
    )
    Datadog.initialize(
        appContext: .init(),
        configuration: Datadog.Configuration
            .builderUsing(clientToken: "<client_token>", environment: "<environment_name>")
            .set(serviceName: "app-name")
            .set(logsEndpoint: .eu)
            .build()
    )

    アプリケーションを書く際、開発ログを有効にできます。指定したレベル以上の優先度を持つ SDK 内のすべての内部メッセージがコンソールログに記録されます。

    Datadog.verbosityLevel = .debug
  3. Logger の構成:

    logger = Logger.builder
        .sendNetworkInfo(true)
        .printLogsToConsole(true, usingFormat: .shortWith(prefix: "[iOS App] "))
        .build()
  4. 次のいずれかのメソッドで、カスタムログエントリを Datadog に直接送信します。

    logger.debug("A debug message.")
    logger.info("Some relevant information?")
    logger.notice("Have you noticed?")
    logger.warn("An important warning…")
    logger.error("An error was met!")
    logger.critical("Something critical happened!")
  5. (任意) - ログメッセージと一緒に attributes のマップを提供し、発行されたログに属性を追加します。マップの各エントリーは属性として追加されます。

    logger.info("Clicked OK", attributes: ["context": "onboarding flow"])

高度なロギング

初期化

ログを Datadog に送信するようにロガーを初期化する際に、Logger.Builder の次のメソッドを使用できます。

メソッド説明
sendNetworkInfo(true)すべてのログに network.client.* 属性を追加します。デフォルトで記録されるデータには、reachability (yesnomaybe)、available_interfaces (wificellular …)、sim_carrier.name (例、AT&T - US)、sim_carrier.technology (3GLTE …)、sim_carrier.iso_country (例、US)があります。
set(serviceName: "<サービス名>")Datadog に送信されるすべてのログに添付される service 標準属性 の値として <サービス名> を設定します。
printLogsToConsole(true)デバッガコンソールにログを送信するには、true とします。
sendLogsToDatadog(true)Datadog にログを送信するには、true とします。
set(loggerName: "<ロガー名>")Datadog に送信されるすべてのログに添付される logger.name 標準属性の値として <ロガー名> を設定します。
build()すべてのオプションを設定して新しいロガーインスタンスをビルドします。

グローバルコンフィギュレーション

指定されたロガーから送信されるすべてのログにタグと属性を追加/削除するメソッドを以下に記します。

グローバルタグ

タグを追加

addTag(withKey:value:) メソッドを使い、指定されたロガーから送信されるすべてのログにタグを追加します。

// これにより、"build_configuration:debug" タグが追加されます
logger.addTag(withKey: "build_configuration", value: "debug")

注意: <タグの値>文字列 でなければなりません。

タグを削除

removeTag(withKey:) メソッドを使い、指定されたロガーから送信されるすべてのログからタグを削除します。

// これにより "build_configuration" で始まるすべてのタグが削除されます
logger.removeTag(withKey: "build_configuration")

Datadog タグに関する詳細

グローバル属性

属性を追加

デフォルトで、ロガーにより送信されるすべてのログに次の属性が追加されます。

  • http.useragent と抽出された deviceOS プロパティ
  • network.client.ip と抽出された地理的プロパティ (country, city)
  • logger.version、Datadog SDK バージョン
  • logger.thread_name, (main, background)
  • versionInfo.plist から抽出されたクライアントのアプリバージョン
  • environment、SDK の初期化に使われる環境名

addAttribute(forKey:value:) メソッドを使い、指定されたロガーから送信されるすべてのログにカスタム属性を追加します。

// これにより、文字列値を持つ "device-model" 属性が追加されます
logger.addAttribute(forKey: "device-model", value: UIDevice.current.model)

: <属性の値>Encodable (文字列日付、カスタム Codable データモデルなど) に適合する限り任意です。

属性を削除

removeAttribute(forKey:) メソッドを使い、指定されたロガーから送信されるすべてのログからカスタム属性を削除します。

// これにより、"device-model" 属性は今後送信されるすべてのログから削除されます。
logger.removeAttribute(forKey: "device-model")

その他の参考資料

お役に立つドキュメント、リンクや記事: