モバイルアプリのログを収集して「何が起きたかわからない」から脱却しよう

モバイルアプリの詳細ログをNew Relicに統合する方法をご紹介します。New Relicがデフォルトで取得する情報に加えてログを活用してトラブルシュートを効率化しましょう。

# 重要性を増すユーザー体験の把握（RUM）

日々の私生活や会社生活においてデジタルサービスが必要不可欠になっている昨今、デジタルサービスの提供側としてはサービスが止まったり、操作が重いなどのユーザーの体験を損なうような問題は迅速に原因を突き止め、解決する必要があります。

その際に重要になるのが、ユーザーがどのような操作をしてどのような体験をしているかを正確に把握することです。これにより問題事象の再現や原因の究明ができ、解決を早めることができます。

ユーザーの体験の把握、それをサポートするのがRUM（リアルユーザーモニタリング）です。オブザーバビリティプラットフォームをSaaS提供しているNew RelicではRUM機能として、PCやモバイルのブラウザやモバイルアプリのWebViewとして動作するアプリケーションからユーザーの体験を収集するNew Relic Browser、およびiOSやAndroidで動作するモバイルアプリからユーザの体験を収集するNew Relic Mobileを提供しています。

これらRUMを利用することで、ユーザーがどのような環境で、いつどのような操作をし、パフォーマンスやエラーに関してどのような体験をしたかを把握することが可能になります。

https://newrelic.com/jp/blog/best-practices/what-is-rum


今回の記事では、RUMの一機能であるNew Relic Mobile、特にユーザーのモバイル端末に出力されるモバイルアプリのログをSaaSに統合してアプリで発生している問題の詳細調査を行う方法をご紹介します。


# New Relic Mobileとは

New Relic Mobileとは、モバイルアプリに組み込まれたSDKがモバイルアプリのパフォーマンスやエラー、ユーザー操作などを記録することで、モバイルアプリにおけるユーザー操作、パフォーマンスやアプリのエラー、クラッシュなどの問題を分析できる機能です。


SwiftやObjective-C、Javaなどで開発されたiOS/Androidのネイティブアプリはもちろん、FultterやReact Native、Xamarinなどのクロスプラットフォームフレームワーク、ゲームでよく利用されるUnity、Unreal Engineにも対応しています。


また、モバイルアプリと通信しているバックエンドのアプリケーションと自動的に情報を関連づけるので、エンドツーエンドでユーザー影響のある問題の調査を効率的に行えることが特徴です。



ざっくりですがNew Relic Mobileでは以下のようなことができます。
- クラッシュや例外の分析
- HTTP通信などネットワークパフォーマンスの分析
- バックエンドのアプリケーションでの一気通貫でのボトルネックやエラーの分析
- バージョン毎の品質分析
- 利用者の地域や端末種別、ユーザー操作の分析
- ビジネス的なKPIの収集と可視化、分析


New Relic Mobileの詳細については公式ドキュメントをご参照ください。

https://docs.newrelic.com/jp/docs/mobile-monitoring/new-relic-mobile/get-started/introduction-mobile-monitoring/


# モバイルアプリのログを統合して問題解決を効率化

さて、本題です。上記の通り、New Relic Mobileではクラッシュやパフォーマンスの情報をSDKが自動的に収集するため、その情報を利用することでユーザーに影響を与えるような問題を把握し、解決することを可能にします。これに加え、モバイルアプリの詳細ログも収集することが可能です。

これまでアプリのログを明示的に収集するような作り込みをしていない限りは、アプリのログはユーザーの端末に捨てられている訳ですが、このログをSaaSに統合することにより、自動的に収集されている情報と組み合わせながら、さらに詳細な分析を可能にし問題解決を早めることができます。

![New Relic Mobile.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/7213ea7d-f26a-b46c-76ab-60c3e61430a8.png)


:::note info
関連するアップデートの詳細はこちら
[New Relic アップデート(2024年7月)
](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202407 "New Relic アップデート(2024年7月)")[New Relic アップデート一覧
](https://newrelic.com/jp/blog/nerdlog/new-relic-update  "New Relic アップデート一覧")
:::

# やってみよう
アプリケーションのログの統合の仕方は非常に簡単です。やることは2つだけです。
- モバイルアプリにログ出力を実装する
- New RelicのUI上でログの転送を有効にする

### モバイルアプリにログ出力を実装する
New Relic MobileのSDKにログ出力用のメソッドが定義されているので、アプリケーションのコードの中でログ出力したい箇所でそのメソッドを呼び出すコードを追加します。

以下はSwiftの例です。この例では、WarnやErrorなど、ログレベル毎に用意されたメソッドを使っています。

```モバイルアプリログ出力 (ログレベル別メソッド)
NewRelic.logError("Encountered error=error=\(error.localizedDescription).")
NewRelic.logWarning("Warning text.")
NewRelic.logInfo("Info text.")
```

もしくは、汎用的なメソッドも定義されているのでそちらを利用して共通化したり、例えばユーザーIDなどの追加の属性情報をログに足したりすることもできます。
```モバイルアプリログ出力 (汎用メソッド)
NewRelic.logAll([
    "logLevel": "WARN",
    "message": "This is a test message for the New Relic logging system."
])

NewRelic.logAttributes([
    "logLevel": "WARN",
    "message": "This is a test message for the New Relic logging system.",
    "additionalAttribute1": "attribute1",
    "additionalAttribute2": "attribute2"
])
```

どうでしょう？非常に簡単です。

特にログ出力に関しては、共通のロガーを作っているケースが大半だと思いますので、ソースコードのあちこちにNew Relicでログ出力するためのコードを書く必要はなく、修正箇所を局所化することができます。

New Relic Mobile SDKのAPIの利用方法については以下を参照ください。

https://docs.newrelic.com/jp/docs/mobile-monitoring/mobile-monitoring-ui/mobile-logs/


### New RelicのUI上でログの転送を有効にする
アプリケーションにNew Relicのログ出力のコードを追加しただけでは、New Relicにログは転送されません。これは必要なタイミングで必要な量とログレベルのログを転送することをコントロールできるようにするためです。

ログの転送は、New Relic MobileのUIにて設定します。
New Relicログイン後、一番左のMobileのメニューにアクセスします。New Relic Mobile SDKがデータを送信していると該当のアプリケーションが出ているはずなので、それを選択し、”Application”というメニューを選択します。

設定箇所は大きく3つです。

<strong>Mobile Logs</strong>
トグルをONにし、ログの転送を有効にします。これを有効にすることでエージェントがログ転送を開始します。（アプリケーションに反映されるまでタイムラグはあります）

<strong>Sample rate of total sessions</strong>
転送するログのサンプリングレートです。モバイルアプリが起動した際の総セッション数に対して何%のセッションからログを収集するかを指定します。0.000001から100まで指定可能で、デフォルトは10になっています。(100は、100%=全量を意味します）

<strong>Logs verbosity</strong>
転送対象にするログのログレベルです。デフォルトはWarnで、その場合はWarnおよびErrorのログが転送されます。この値をErrorに変えた場合は、Errorレベルのログのみが転送されます。

![config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/a59412a9-6be9-b6ec-c4da-1304716f2387.png)

なお、Info以上の詳細ログはエージェントのデフォルト設定で出力自体がされないため、Info以上のログを共有する場合にはエージェントのログレベルをあげる必要があります。エージェントのログレベルのあげ方は公式ドキュメントを参照してください。



### データを確認しよう
設定が終わったらUIでログが転送されているか確認しましょう。ログは同じくNew Relic Mobile画面のLogsメニューから確認できます。

無事にアプリケーションの詳細ログが確認できました。今回はサンプルなので簡単なログを連携していますが、アプリケーションの詳細情報をログが連携できればトラブルシュートが効率化できるでしょう。また、ログは自動的に構造化されており、ユーザーIDなど他の属性も持っているのでそのような属性でのフィルタや分析もしやすくなっています。

![log_ui.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/a82c74ca-21fb-4255-0648-09646bb555e2.png)



# 想定されるユースケース
### Vup前後での致命的な問題の把握
アプリのVupにはトラブルはつきものです。Vupの際にバックエンドで捕捉できない致命的な問題がモバイルアプリ側で起きていないかをアプリのログを使って確認することができるようになります。

### 一時的に連携するログレベルをあげる
闇雲にログを垂れ流し続けるとモバイルのリソースやネットワークに影響が出る可能性もありますので、詳細調査が必要なタイミングで一時的にログ連携をするというのが多いかもしれません。モバイルアプリのユーザーが不具合を被っているが自動的に収集している情報だけでは、らちが明かない場合にログ転送を有効にしたり、ログレベルをErrorからWarnに変えたりして、一時的に詳細調査に必要なデータを取得することができます。

UIの設定は自動的にモバイルアプリ側のSDKに反映されるので、アプリを再配布したりアプリを再起動したりする必要はありません。

### サンプリング数を調整する
大半のユーザーに影響を与えるような問題は少量のセッションから収集したログで調査可能ですが、場合によっては特定条件を満たすユーザーや端末のみ発生するケースもあります。その場合は、サンプリングレートを調整するなどして、ログ量を段階的に増やしながら調査することもできます。この場合も1点目と同様に再起動は必要ありません。

### チームをまたいだトラブルシュート
開発環境が手元にあるアプリの開発者は、開発中のアプリであればデバッグしながらログを確認することは可能です。一方で、開発環境を持たないQAや運用メンバーはデバッグができないのでログを簡単に見る手段はありません、そのようなメンバーでも発生した状況を把握できる環境を提供する方法として、SaaSにアプリケーションのログを集約するというのは有効かもしれません。

# まとめ
今回は、ユーザー体験の把握（RUM）の重要性が増している背景を踏まえ、New Relic Mobileとその一機能であるモバイルアプリログの連携機能を紹介しました。New Relic Mobile自体、SDKの導入だけで自動的に計測可能なので是非お試しください。

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！
](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::
:::note info
[New Relic株式会社のQiita Organization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::