Xamarin逆引きTips

Xamarin逆引きTips

Xamarin.iOS/Androidでログを出力するには?

2014年11月5日

Xamarin.AndroidでネイティブAndroidのLogクラスを使ってログ出力する方法と、Xamarin.iOS/Androidで.NET基本クラスライブラリ機能を使ってログ出力する方法を解説する。

奥山 裕紳(@amay077
  • このエントリーをはてなブックマークに追加

 アプリケーションのログ出力は、ネイティブAndroidの開発ではandroid.util.Logクラスが、iOS開発ではNSLog関数が一般的に使われている。

 今回は、これらの機能をXamarin.Android/iOSで使用する方法と、Xamarin.iOS/Androidで共通なログ出力処理を行う方法を解説する。

1. Xamarin.Androidでのログ出力

 Xamarin.Androidでは、ネイティブで使っていたLogクラス(XamarinではAndroid.util名前空間)がそのまま使用できる。

C#
……省略……
private const string TAG = "MainActivity";
……省略……

// ActivityにButtonを追加し、それを押した時のイベントハンドラー
button.Click += (sender, e) => 
{
  Android.Util.Log.Verbose(TAG, "細かな情報を記録します");
  Android.Util.Log.Info(TAG, "情報を記録します");
  Android.Util.Log.Debug(TAG, "デバッグ情報を記録します");
  Android.Util.Log.Warn(TAG, "警告情報を記録します");
  Android.Util.Log.Error(TAG, "エラー情報を記録します");
};
Xamarin.Androidでログ出力を行うコード例(MainActivity.cs)

 出力されたログは、adb logcatコマンドの他、Xamarin Studioでも確認できる。

2. Xamarin.iOSでのログ出力

 ネイティブiOSのNSLog関数は、Xamarin.iOSには用意されていない。よって、次に示す共通なログ出力処理を使用する。

3.Xamarin.iOS/Androidで共通なログ出力処理を行う

 .NETの開発者にはおなじみだと思うが、.NET Frameworkには、初期からDebugクラスやTraceクラス(いずれもSystem.Diagnostics名前空間)、Consoleクラス(System名前空間)という情報出力系のクラスがある。これらのクラスはXamarin.iOS/Androidにおいても適切に実装されているので、これらを使うことでログ出力処理を共通化できる。

 これらのクラスを使うと、Logクラスを使ったXamarin.Androidの処理は次のように書ける。

C#
// ActivityにButtonを追加し、それを押した時のイベントハンドラー
button.Click += (sender, e) => 
{
  System.Diagnostics.Debug.WriteLine("Debug.WriteLine による出力です");
  System.Diagnostics.Trace.WriteLine("Trace.WriteLine による出力です");
  System.Console.WriteLine("Console.WriteLine による出力です");
};
Xamarin.Androidで、.NETの基本クラスライブラリを使ってログ出力を行うコード例(MainActivity.cs)

 また、Xamarin.iOSでも同じように記述できる。

C#
// ViewControllerにNSButtonを追加し、それを押した時のイベントハンドラー
button1.TouchUpInside += (sender, e) => 
{
  System.Diagnostics.Debug.WriteLine("Debug.WriteLine による出力です");
  System.Diagnostics.Trace.WriteLine("Trace.WriteLine による出力です");
  System.Console.WriteLine("Console.WriteLine による出力です");
};
Xamarin.iOSで、.NETの基本クラスライブラリを使ってログ出力を行うコード例(XxxViewController.cs)

Debug/Trace/Consoleクラスの実行条件

 同じようなメソッドを持つクラスが、なぜ3つもあるのか。それは、以下のような違いによるものだ。

  • Debugクラス: デバッグビルド時にのみ評価、出力される
  • Traceクラス: リリースビルド時にのみ評価、出力される
  • Consoleクラス: デバッグ/リリース関係なく常に出力される(もともとは「標準出力」へ書き出すためのクラスだ)

 Xamarin Studioの左上にあるビルド構成を「Debug」にすると、下の画面のようにTrace.WriteLineの行が灰色となり、無効化されるのが分かるだろう。これは、デバッグモードではTrace.WriteLineの行が「存在しないもの」として扱われ、ビルドされたアプリケーションには含まれないことを意味している。

図1 ビルド構成「Debug」時のコード

 次にビルド構成を「Release」に変更すると、Debug.WriteLineの行が無効に、Trace.WriteLineの行が有効になるはずだが、両方とも無効で、Console.WriteLineの行のみが有効となっている(図2参照)。

図2 ビルド構成「Release」時のコード(TRACEシンボル未定義)

 これは、リリースビルドでも既定ではTraceクラスが無効になっているためで、[システムメニュー]-[プロジェクト]-[<プロジェクト名>のオプション]から、図3に示す設定ダイアログを表示させ、[ビルド]-[コンパイラ]の設定で、[コンフィグレーション]を「Release」とした後、[シンボルを定義]にTRACE;と記述して[OK]ボタンを押す。

図3 TRACEシンボル定義の設定画面

 すると、図4のようにTraceの行が有効化されるはずだ。

図4 ビルド構成「Release」時のコード(TRACEシンボル定義済)

 図3の設定を、Debug、Releaseで見比べると分かるが、シンボルにDEBUG;が定義されているとDebugクラスが有効となり、TRACE;が定義されているとTraceクラスが有効になる。つまり、コードを変更せずとも、プロジェクトの設定によりログの出力がON/OFFできるということだ。一方でConsoleクラスは設定に関係なく必ず出力される。

まとめ

 Debugクラス、Traceクラスを利用すると、iOS/Androidアプリ開発でログ出力を共通化できる例を解説した。しかしこれらのクラスはログ出力としては簡易的なものであり、利用用途は開発中のアプリに限られるだろう。

 配布したアプリケーションのログの収集や分析、クラッシュレポートの収集などを行いたい場合は、DeployGateCrittercismなどのユーザー分析サービスが提供するネイティブのライブラリを検討するべきだろう。Xamarinとしても、先日開催されたEvolve 2014で、Xamarin Insightsという新機能が発表されたので、今後の情報に注目したい。

【コラム】Xamarinに対応したログ出力ライブラリは存在するのか?

 .NET開発でのログ出力ライブラリでは、log4jを.NETへ移植したlog4netが有名だろう。log4netはXamarinで利用できるのだろうか?

 これらの情報を見る限り、積極的に利用を勧められる状態にはないようだ。Xamarinでの開発でlog4netが使われている雰囲気も感じられない。

 他には、アプリ開発のフレームワークとして、MvvmCrossを利用しているならば、MvxTraceというクラスが利用できる。MvvmCrossは利用者の多いライブラリであるため、このクラスを使っている開発者も多いだろう。

※以下では、本稿の前後を合わせて5回分(第23回~第27回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

23. Xamarin.Androidで地図にマーカーを表示するには?(Google Maps使用)

「Google Maps Android API v2」を使って、Xamarin.Androidアプリで地図上にマーカーや吹き出しを表示する方法を解説する。

24. Xamarin Studio で画面を分割するには?(ショートカットキー情報あり)[Mac&Win対応]

Xamarin Studioの新機能として、コードエディターを左右の領域に分割して表示できるようになった。マウスとショートカットキーによる操作方法を説明する。

25. 【現在、表示中】≫ Xamarin.iOS/Androidでログを出力するには?

Xamarin.AndroidでネイティブAndroidのLogクラスを使ってログ出力する方法と、Xamarin.iOS/Androidで.NET基本クラスライブラリ機能を使ってログ出力する方法を解説する。

26. Xamarin.iOS/Androidでソースコードを共有するには?(リンクファイル編)

Xamarin.iOS/Android間でソースコードを共有する方法の1つとして、Xamarin Studioのプロジェクト内でソースファイルへのリンクを追加する方法を説明する。

27. Xamarin.iOS/Androidでソースコードを共有するには(ポータブルクラスライブラリ編)

Xamarin.iOS/Android間でソースコードを共有する方法の1つとして、複数のプロジェクトから共通のポータブルクラスライブラリ(PCL)を参照する方法を説明する。

イベント情報(メディアスポンサーです)

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • グレープシティ株式会社
  • 日本マイクロソフト株式会社