Strix Cloudって何?という方は、前にStrix Cloudについての記事を投稿したのでそちらを御覧ください。
記事で使用しているバージョン
- Unity 2020.3.5f1
- StrixUnitySDK 1.5.0
Strix Cloudのログシステムについて
Strix Cloudにはログシステムという便利なログ機能があります。
ログシステムは個別の機能ごとにロガーを作成することが出来ます。
即ち、一部のStrixの機能のロガーのみを有効化し、ログの可読性を向上させるといったことが可能です。
また、ロガーにはログレベル(Filter) が設けられていて、警告レベル以上のログのみ表示することもできます。
しかし、このログレベルの設定が厄介だったので、ここでしっかりまとめておきます。
ログレベルが適切に設定出来なかった
以下のコードでログレベルを警告レベルに引き上げようとします。
LogManager.Instance.Filter = Level.WARNING;
ですが、設定後のログでも、それ以下のINFOレベルのログが表示されてしまいました。
ログシステムの内部実装を追ってみます。
LogManagerとLogger
それぞれのLoggerはLogManagerクラスによって管理されています。
- LogManager
- Logger: StrixReplicator
- Logger: StrixBehaviour
- Logger: AbstractNetworkStrategy
- etc..
そして、それぞれのロガーにもログレベルが設定されています。
ロガーごとのログレベルは、ロガーを作成した時点でのLogManager.Filter
が適用されます。
従って、今回の問題は以下の流れで発生していたようです。
-
LogManager.Filter
にLevel.INFO
が設定される。(初期値はINFO
) - StrixCloudの機能のロガーが作成される。
- ロガーのログレベルに
Level.INFO
が適用される。 -
LogManager.Filter
にLevel.WARNING
を設定し、ログレベルを引き上げる。 - ログを出力するが、作成時に
Level.INFO
が設定されていたため、それを優先して出力する。
解決策
StrixCloudの機能を用いる前に初期化するべきでした。
機能を用いた時点でロガーが生成されてしまうため、起動時にAwake()などの初期化関数でログレベルを設定すれば、正常に動作します。
任意のタイミングで設定したい場合は、ロガー全てのログレベルを書き換えるのも手です
public void SetLoggersLevel(Level logLevel)
{
foreach (Logger logger in LogManager.Instance.GetLoggers().Values)
{
logger.Filter = logLevel;
}
}
これでも思い通りにならない場合は
5.ログを出力するが、作成時に
Level.INFO
が設定されていたため、それを優先して出力する。
優先して出力すると書いたのは、ロガーのログレベルよりLogManagerのログレベルが優先される場合があるからです。
Loggerクラスに書かれているログの出力条件は以下です。
logLevel >= this.Filter || logLevel >= LogManager.Instance.Filter
Loggerのログレベル以上または、LogManagerのログレベル以上のときに出力されるようです。
常にログレベルが低い方が優先されるので、
Logger.Filter == Level.WARNING && LogManager.Filter == Level.INFO
の時はLogManager.Filter
が優先され
Logger.Filter == Level.INFO && LogManager.Filter == Level.WARNING
の時はLogger.Filter
が優先されるということですね。
ドキュメントには詳細に書かれていないので、初見だと詰まりそう...