世界初!Swift用ロギングプラットフォーム「SwiftyBeaver」を試してみた

2017.11.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

SwiftyBeaverとは

公式サイトからの引用です。

The World’s First Logging Platform for Swift

世界で初めてのSwift用ロギングプラットフォームとのことです。
アプリからのログを収集し、分析に役立てることができます。

検証環境

本エントリは以下の環境で検証を行っています。

  • macOS Sierra バージョン 10.12.6
  • Xcode Version 9.1 (9B55)
  • Swift 4
  • CocoaPods バージョン 1.3.1
  • iPhone X シミュレーター iOS 11.1

セットアップ

ロギングフレームワークが提供されているのでセットアップします。
Introductionによると、Swift 2.2以降で使用可能のようです。
今回はSwift 4なので最新のバージョンをインストールします。
インストールはSwift Package ManagerやCarthageなど、様々なツールから可能ですが、今回はCocoaPodsを使用しました。

podfileにpod 'SwiftyBeaver'を記載し、pod installするだけです。
記事執筆時点の最新であるバージョン1.4.3がインストールされました。

※ CocoaPods以外の方法でのインストール方法についてはInstallationをご覧ください。

ログ出力に必要な設定を行う

フレームワークがインストール出来たら.xcworkspaceファイルをXcodeで開き、AppDelegateに以下を追加します。

import SwiftyBeaver

// SwiftyBeaver.Type型
let log = SwiftyBeaver.self

以降、SwiftyBeaver.Type型である変数logを通じてログ出力を行なっていきます。

出力先はいろいろ

ログの出力先は以下から選ぶことができます。もちろん混在させることも可能です。※実装すれば自前のサーバーにログを送ることも可能です。

  • Xcodeのコンソール
  • ファイル
  • SwiftyBeaver Platform

上記をそれぞれ試してみました。

Xcodeのコンソール

ログの出力先の設定はaddDestinationメソッドで行います。ConsoleDestinationを生成して追加します。
また、ログレベルに応じて出力メソッドが異なるのでログレベルに対応したメソッドを使いましょう。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    // Xcodeのコンソールに出力
    let console = ConsoleDestination()
    log.addDestination(console)

    log.verbose("verboseログだよ")
    log.debug("debugログだよ")
    log.info("infoログだよ")
    log.warning("warningログだよ")
    log.error("errorログだよ")

    return true
}

出力結果はこんな感じ。カラーリングも見やすい!!( ´◡` )

xcode_console_log

ファイル

次はファイルに出力してみます。ファイルへの出力はデフォルトでCachesディレクトリに「swiftybeaver.log」というファイル名で保存されますが、 logFileURLプロパティで任意の場所に変更できます。

以下はターミナルから確認しやすいように/tmp/swiftybeaver.logに出力してみた場合です。

// ファイルに出力(デフォルトではCachesディレクトリに「swiftybeaver.log」というファイル名で保存される)
let file = FileDestination()
// 出力先を「/tmp/swiftybeaver.log」に変更
file.logFileURL =  URL(fileURLWithPath: "/tmp/swiftybeaver.log")
log.addDestination(file)

こちらはターミナルからtailコマンドで確認してみた結果です。カラーリングされていて見やすいですね( ´◡` )

terminal_log

SwiftyBeaver Platform

ログ出力先としてのSwiftyBeaver Platformはクラウドのデータストレージです。
すべてのログデータは、SwiftyBeaver Platformに送信される前にユーザーのデバイス上で暗号化(AES-256 CBC)されます。

SwiftyBeaver Platformにはいくつかプランがありますが、今回は無償のFree版を使いました。
プラン毎に制限や価格が異なります。詳細はPlans & Pricingをご覧ください。

まずはアカウントを作成

SwiftyBeaver Platformにログを送るにはまずはWebから専用のMacアプリをダウンロードします。

download_app

「SBMac.zip」がダウンロードされます。展開するとSwiftyBeaverというアプリが表示されるので起動します。

swiftybeaver_app

起動するとサインアップ画面が表示されるのでメールアドレスとパスワードを入力して「Signup」をクリックします。

signup

任意のファイル名を入力すると以下の画面が表示されるので、「Generate New App Credentials」をクリックします。

generate_new_app_credentials

AppID、App Secret、Encryption Keyが生成されるので控えておきましょう。 控えたら「Connect」をクリックします。

appid

「Connect」をクリックすると以下の画面が表示されました。どうやらここにログが表示されそうですね。
まだログが1件もないので空です。送ってないので当たり前( ´◡` )

empty_log

ログを送ってみる

入手したAppID、App Secret、Encryption Keyを使ってログを送ってみましょう。以下のAppID、App Secret、Encryption Keyの部分はご自身の環境に合わせて書き換えてください。

let platform = SBPlatformDestination(appID: "YourAppID", appSecret: "YourAppSecret", encryptionKey: "Your32CharKey")
log.addDestination(platform)

実行して少したつとMacアプリ上にログが表示されました( ´◡` ) デバイスを一意に識別するためのUUIDも自動で発行されるようです。

platform_log

ログのカスタマイズについて

ログのフォーマットをカスタマイズしたい場合はdestinationのformatプロパティを設定します。
以下はログレベルと指定した文字列を出力する例です。

let console = ConsoleDestination()
console.format = "$L: $M"  // loglevel: message
log.addDestination(console)
log.debug("Hello World")

// log output: 
DEBUG: Hello World

フォーマット用の変数がこちらにまとめられていますので、カスタマイズしたい場合はチェックしてみてください。

おわりに

今回はSwiftのロギングプラットフォーム「SwiftyBeaver」を試してみました。
手軽にユーザーからのログを収集する手段として活用できそうです。 今後のアップデートも注目していきたいと思います。