Posted at

【iOS/Swift】 ログ管理ツール "SwiftyBeaver" を使ってログをもっと活用する


こんなことありませんか?


  • 実機iPhoneを動かしながらログを取得したい

  • だけど、ケーブルでMacに繋ぎたくない

普通にDebugモードでiPhoneを接続した状態ならログはXcodeのコンソール上からみることができますが、例えばGPSを使ったアプリのように、屋外での利用時のログを取りたい場合にはなかなかMacを持ち歩いてログを取るのは現実的ではないですよねー。

もちろん、自分でFileSystemにログを保存してやって、それを後から取り出すようにしてもいいのですが、作るのも面倒だったので何かいいツールないかと探してみたところ、

【Swift】ロギングライブラリを簡単に比較した

こちらの記事で、SwiftyBeaver が良さそうな感じだったので使ってみました。

良さそうだと思ったポイントとしては、


  • クラウドへログを自動アップロードしてくれるので管理が楽そう

  • ローカルファイルへの保存も一緒にやってくれる

  • クラウドへアップロードされたログを専用ツールで簡単に閲覧できそう

以下、使ってみた手順です。

ちなみに、クラウドへのログのアップロードを使わない場合には、アカウント作成や専用Macアプリのインストールは不要です。


SwiftyBeaverとは

73b1ee84-a034-11e6-8753-2d060502397c.jpg


Colorful, flexible, lightweight logging for Swift 3, Swift 4 & Swift 5.

Great for development & release with support for Console, File & cloud platforms.

Log during release to the conveniently built-in SwiftyBeaver Platform, the dedicated Mac App & Elasticsearch!


その名の通り、Swiftのためのツールで、ログを見やすい形にしてくれるツールです。

大きな特徴として、専用のMacアプリを提供しており、クラウドにログを自動アップロードすればアプリからそれを閲覧できます。


インストール

SwiftyBeaverのインストール方法です。

基本的には 公式のGitHubのReadme を読みながら進めれば良いかとは思います。


Cocoapodsでインストール

Cocoapodsに対応しているので簡単にインストールが可能です。

Podfileに以下の一文を入れて、$ pod install します。

pod 'SwiftyBeaver'


ログを埋め込む

ここでは、Readmeにある通りのコードを埋め込んでみます。

ここでは、AppDelegatefunc application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool に以下のコードを埋め込みました。


// add log destinations. at least one is needed!
let console = ConsoleDestination() // log to Xcode Console
let file = FileDestination() // log to default swiftybeaver.log file

// 先ほど取得した App ID/App Secret/Encryption Key を埋め込む
let cloud = SBPlatformDestination(appID: "appId", appSecret: "appSecret", encryptionKey: "encryptionKey") // to cloud

// use custom format and set console output to short time, log level & message
console.format = "$DHH:mm:ss$d $L $M"
// or use this for JSON output: console.format = "$J"

// add the destinations to SwiftyBeaver
log.addDestination(console)
log.addDestination(file)
log.addDestination(cloud)

// Now let’s log!
log.verbose("not so important") // prio 1, VERBOSE in silver
log.debug("something to debug") // prio 2, DEBUG in green
log.info("a nice information") // prio 3, INFO in blue
log.warning("oh no, that won’t be good") // prio 4, WARNING in yellow
log.error("ouch, an error did occur!") // prio 5, ERROR in red

// log anything!
log.verbose(123)
log.info(-123.45678)
log.warning(Date())
log.error(["I", "like", "logs!"])
log.error(["name": "Mr Beaver", "address": "7 Beaver Lodge"])

// optionally add context to a log message
console.format = "$L: $M $X"
log.debug("age", String(123)) // "DEBUG: age 123"
log.info("my data", context: [1, "a", 2]) // "INFO: my data [1, \"a\", 2]"

Cloudにログをアップロードするためには、App ID、AppSecret、Encryption Key を埋め込む必要があります。

これらの値の取得方法は後述の「ログをクラウド管理する」で記述しています。

SwiftyBeaverでは、ログを


  • Xcodeのコンソール

  • ローカルファイル

  • クラウド

それぞれに対して出力してやることができます。

必要に応じて使い分けるのが良いかと思います。


ログをクラウド管理する

SwiftyBeaverでは、ログをクラウドにアップロードしてやることで、簡単に専用アプリからログを閲覧するkとが可能です。


Macアプリをインストール & アカウント作成

公式サイトからMac用のアプリをインストールします。

アカウントを作成します。


アプリ登録

Mac用アプリを開くと、

スクリーンショット 2019-08-02 14.34.18.png

こんな感じの画面が表示されます。

新しく自分のアプリを登録するので、Generate New App Credentials をクリックします。

そうすると、


  • App ID

  • App Secret

  • Encryption Key

が表示されるので、これを先ほどのSwiftのコードに埋め込んでやります。

そしてアプリを起動してやると、ログが出力されるはずです。

実際に、MacのSwiftyBeaverアプリを起動してやると、以下のスクショのようなログが見えるはずです!

めっちゃ見やすい!

スクリーンショット 2019-08-02 14.37.00.png

しかし、残念ながら無料アカウントでは1日分のログしか見ることができません。

また、どうもクラウドのログをダウンロードすることも難しいようなので、使えるシーンは結構限られるかも?


ローカルファイルへのログ出力&保存すれば、無料でも後から確認できる!

先ほどのAppDelegateに書き込んだコードでは、ログの出力先として、クラウド以外にもローカルファイルも指定していました。

デフォルトでは、ログファイルは、

<AppName>/Library/Cache/SwiftyBeaver.log

に書き込まれています。

このファイルへのアクセス方法は色々あります。

【参考】

iOS Fileの置き場所

一番簡単なのは、iExplorerを使ってやるのが良いかと思います。