UnityのDebug.Logの内容を自作のクラスで取得する

Unityのログの内容を自作クラスで取得したい場合、Application.RegisterLogCallback関数を使用すると、ログ(UnityEngine.Debug.Log等)を自作クラスで取得することができます。

Application.LogCallBack(デリゲート)に対応した関数をApplication.RegisterLogCallbackに引数で指定することで、コールバックされます。

gist9347621

Application.LogCallBackの引数の説明

引数 説明
condition (string) Debug.Logなどの引数の文字列
stackTrace (string) ログが出力された時の、コードの実行
type (LogType) ログの種別

Application.RegisterLogCallbackで登録したハンドラー関数に渡される値がプラットフォームによって変わってしまうようです。

変わってしまうのは、上記の表でで言うと、第二引数(string stackTrace)のみ。

stackTraceのプラットフォーム別の一覧

プラットフォーム string stackTrace
Unityエディタ 全てのログの、コールされたコード行数まで
iOS端末 例外のみで、コールされた関数名のみ
Android端末 例外のみで、コールされた関数名のみ

iOS/Android端末では例外以外のstackTraceが取得できない

iOS / Android端末で例外以外のstackTraceを取得する

System.Diagnostics.StackTraceを使えば、iOS / Android端末でもApplication.LogCallbackのstackTrace部分と類似した情報を取得できます。

gist9438248

ただし、実行コードの行数までは取得できないようです。
関数呼び出しの順番は取得できるようです。 (Unity Editor上ではどちらも取得できるようです。)

各プラットフォーム毎のログ出力のまとめ

Application.RegisterLogCallbackに登録した関数が、実際に返すデーターをプラットフォーム別で検証しました。

Debug.Log

iOS / Android f:id:takashicompany:20140303234654p:plain

Unity Editor f:id:takashicompany:20140304235651p:plain

iOS / AndroidではstackTraceが空文字になっています。 System.Diagnostics.StackTraceを使えば、関数の呼び出しフローを取得できます。

Debug.Exception (例外)

iOS / Android f:id:takashicompany:20140303234644p:plain

Unity Editor f:id:takashicompany:20140304235646p:plain

iOS / AndroidではstackTraceに例外の情報が渡されます。

サンプルコード

UnityのApplication.RegisterLogCallbackの検証

まとめ

  • 自作のクラスでログを取得したい場合は、Application.RegisterLogCallbackを用いる
  • Application.RegisterLogCallbackで登録した関数に渡される情報はプラットフォーム毎に異なる
  • iOS / Androidでは、stackTraceでコード実行時の行数を取得できない。

ちなみに、GUIConsoleでは、System.Diagnostics.StackTraceを採用しました。