UnityのDebug.Logの内容を自作のクラスで取得する
Unityのログの内容を自作クラスで取得したい場合、Application.RegisterLogCallback関数を使用すると、ログ(UnityEngine.Debug.Log等)を自作クラスで取得することができます。
Application.LogCallBack(デリゲート)に対応した関数をApplication.RegisterLogCallbackに引数で指定することで、コールバックされます。
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部分と類似した情報を取得できます。
ただし、実行コードの行数までは取得できないようです。
関数呼び出しの順番は取得できるようです。
(Unity Editor上ではどちらも取得できるようです。)
各プラットフォーム毎のログ出力のまとめ
Application.RegisterLogCallbackに登録した関数が、実際に返すデーターをプラットフォーム別で検証しました。
Debug.Log
Unity Editor
iOS / AndroidではstackTraceが空文字になっています。 System.Diagnostics.StackTraceを使えば、関数の呼び出しフローを取得できます。
Debug.Exception (例外)
Unity Editor
iOS / AndroidではstackTraceに例外の情報が渡されます。
サンプルコード
UnityのApplication.RegisterLogCallbackの検証
まとめ
- 自作のクラスでログを取得したい場合は、Application.RegisterLogCallbackを用いる
- Application.RegisterLogCallbackで登録した関数に渡される情報はプラットフォーム毎に異なる
- iOS / Androidでは、stackTraceでコード実行時の行数を取得できない。
ちなみに、GUIConsoleでは、System.Diagnostics.StackTraceを採用しました。