こんなことありませんか?
- 実機iPhoneを動かしながらログを取得したい
- だけど、ケーブルでMacに繋ぎたくない
普通にDebugモードでiPhoneを接続した状態ならログはXcodeのコンソール上からみることができますが、例えばGPSを使ったアプリのように、屋外での利用時のログを取りたい場合にはなかなかMacを持ち歩いてログを取るのは現実的ではないですよねー。
もちろん、自分でFileSystemにログを保存してやって、それを後から取り出すようにしてもいいのですが、作るのも面倒だったので何かいいツールないかと探してみたところ、
こちらの記事で、SwiftyBeaver が良さそうな感じだったので使ってみました。
良さそうだと思ったポイントとしては、
- クラウドへログを自動アップロードしてくれるので管理が楽そう
- ローカルファイルへの保存も一緒にやってくれる
- クラウドへアップロードされたログを専用ツールで簡単に閲覧できそう
以下、使ってみた手順です。
ちなみに、クラウドへのログのアップロードを使わない場合には、アカウント作成や専用Macアプリのインストールは不要です。
SwiftyBeaverとは
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にある通りのコードを埋め込んでみます。
ここでは、AppDelegate
の func 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用のアプリをインストールします。
アカウントを作成します。
アプリ登録
こんな感じの画面が表示されます。
新しく自分のアプリを登録するので、Generate New App Credentials をクリックします。
そうすると、
- App ID
- App Secret
- Encryption Key
が表示されるので、これを先ほどのSwiftのコードに埋め込んでやります。
そしてアプリを起動してやると、ログが出力されるはずです。
実際に、MacのSwiftyBeaverアプリを起動してやると、以下のスクショのようなログが見えるはずです!
めっちゃ見やすい!
しかし、残念ながら無料アカウントでは1日分のログしか見ることができません。
また、どうもクラウドのログをダウンロードすることも難しいようなので、使えるシーンは結構限られるかも?
ローカルファイルへのログ出力&保存すれば、無料でも後から確認できる!
先ほどのAppDelegateに書き込んだコードでは、ログの出力先として、クラウド以外にもローカルファイルも指定していました。
デフォルトでは、ログファイルは、
<AppName>/Library/Cache/SwiftyBeaver.log
に書き込まれています。
このファイルへのアクセス方法は色々あります。
【参考】
iOS Fileの置き場所
一番簡単なのは、iExplorerを使ってやるのが良いかと思います。