Unity公式のLoggingパッケージが使い勝手が良さそう
こんにちは、エンジニアの渡辺(@mochi_neko_7)です。
先日Unity 2022 LTSがリリースされたので触っていたのですが、ふとPackageをチェックしていたところ、 Unity公式のLoggingパッケージが存在することに初めて気が付きました。
しかもドキュメントやAPIを見てみる感じでは「こういうのが欲しかった」という印象で期待が持てそうでした。
自分でも少し触ってみたので、本記事ではこのUnity公式のLoggingパッケージを簡単に紹介します。
環境
- Unity 2022.3.0f1
- Unity Logging 1.0.11
Unity公式のLoggingパッケージ
いつの間にかUnity公式からLoggingのパッケージが提供されていました。
主な特徴を挙げるなら下記でしょうか。
- 非同期Logging対応
- Logging architecture | Unity Logging | 1.0.11
- 致命的なログは同期的に、そうでないログはパフォーマンス重視で非同期に、といった使い分けもできます
UnityEngine.Debug
より詳細なLogLevel- Enum LogLevel | Unity Logging | 1.0.11
- 標準だとDebug/Warning/ErrorしかLogLevelがないですが、こちらはLog4jなどの一般的なLoggingライブラリと同等なものが使用できます
- 構造化ログ(JSON)対応
- Logging architecture | Unity Logging | 1.0.11
- ログの内容を解析しやすいJSON形式で出力できます
- ログの出力先のカスタマイズ
- Sinks | Unity Logging | 1.0.11
- ローカルファイルだけでなく、外部サービスに飛ばすことも可能のようです
- Burstによるパフォーマンスの最適化
- ちゃんと追えていませんが、内部では
[BurstCompile]
のAttributeが至る所にあります
- ちゃんと追えていませんが、内部では
どれも高度なLoggingライブラリを使用・作成したことのある方なら欲しいと思う機能ではないでしょうか。
また、プロジェクトのニーズに合わせて細かい挙動をConfigurationでカスタマイズすることも可能です。
導入方法
Package ManagerのUnity Registryから「Logging」を検索してインストールしてください。
もしくは、ご自身のUnityProjectのPackages/manifest.json
の"dependencies"
に下記を追加してください。
"com.unity.logging": "1.0.11",
バージョンは任意のものを指定してください。
使用方法
使用したいAssembly Definitionに下記3つの参照を追加します。
- Unity.Logging
- Unity.Burst
- Unity.Collections
それから
Get started | Unity Logging | 1.0.11
using Unity.Logging; public class UserLogger : MonoBehaviour { void Awake() { Log.Info("Hello, {username}!", "World"); } }
にあるように、Log.XXX(message)
(XXX
は使用するLogLevel)の形で呼び出して利用することができます。
Built-inのLoggingとの対応は一例ですが下記のようなイメージです。
Debug.Log(message)
->Log.Verbose(message)
orLog.Debug(message)
orLog.Info(message)
Debug.LogWarning(message)
->Log.Warning(message)
Debug.LogError(message)
->Log.Error(message)
orLog.Fatal(message)
デフォルトのLogファイルの出力先は、EditorではLogs
フォルダのOutput.log
, Output.log.json
のようです。
実機の出力先は全て確認できているわけではありませんが、Mac実機では通常のLogファイルの出力先とほぼ同じ、Library/Logs/<CompanyName>/<ProductName>/Logs
フォルダのようです。
おそらくWindows、Android、iOSも同様だと思います。
まとめ
Unity公式のLoggingパッケージの簡単な紹介をしました。
特徴として下記を挙げたように、高度なLoggingライブラリとして欲しい機能をしっかり抑えているのではないでしょうか。
- 非同期Logging対応
UnityEngine.Debug
より詳細なLogLevel- 構造化ログ(JSON)対応
- ログの出力先のカスタマイズ
- Burstによるパフォーマンスの最適化
UPMで手軽に導入できる点も魅力的です。
他のLoggingライブラリ
UnityのLoggingライブラリを検索すると下記の情報が出てくるかと思います。
これらと比較しても公式パッケージの導入の手軽さのメリットがありますが、細かい仕様等異なる点もありますので参考にしていただければと思います。
おわりに
自分もまだまだ触り始めたばかりなのであまり深い話までできませんでしたが、使い勝手が良さげな雰囲気は伝わったかと思います。
もうUnityの標準のLoggingは使用せずに、すべてこちらの公式パッケージのLoggingに乗り換えるのもありかなと考えています。
今後はもう少し内部実装を追ってみたり、Configurationのカスタマイズを実際にやってみてその使い勝手も見られたらと思っています。
※2023/07/03追記
ちゃんとした原因は分かっていないのですが、非同期処理内でLog.Debug
を使用するとメインスレッドが完全に止まって返ってこない場合がありました。
SyncModeをFullSyncにするとメインスレッドは返ってくるのですが、内部のエラーになってしまいました。
Burstのバージョンを 1.8.4
-> 1.8.7
に手動で上げたら改善されたのでBurstの不具合の可能性が高いですが、もし困った方がいたら参考にしてください。
"com.unity.logging": "1.0.11", "com.unity.burst": "1.8.7",