はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】Application.logMessageReceivedを用いてUnityのログメッセージが発行されたときに処理を行う

はじめに

今回はUnityのログメッセージが発行されたときに処理を挟むことができるApplication.logMessageReceivedについて取り上げたいと思います。

ログメッセージが発行されたときに受信するためのイベントハンドラー

このイベントはメインスレッドでのみ動作します。もしハンドラー内で、メインスレッドのみ呼び出し可能な Unity の API を使用したい場合や、なんらかの理由があった場合、スレッドセーフでないかもしれません。

Application-logMessageReceived - Unity スクリプトリファレンス

利用している様子

概要

Debug.LogDebug.LogWarning, Debug.Assert, Debug.LogError, Debug.LogExceptionなどを用いてログがコンソールに出力されたときに、Application.logMessageReceivedを利用することで特定の処理を挟むことができます。

public static event Application.LogCallback logMessageReceived
{
    add
    {
        Application.s_LogCallbackHanler += value;
        Application.SetLogCallbackDefined(true);
    }
    remove => Application.s_LogCallbackHandler -= value;
}
public delegate void LogCallback(string condition, string stackTrace, LogType type);

またLogTypeというものが存在し、ログの種類を受け取ることができます。

LogTypeには以下の種類があります。

public enum LogType
{
    /// <summary>
    ///   <para>LogType used for Errors.</para>
    /// </summary>
    Error,
    /// <summary>
    ///   <para>LogType used for Asserts. (These could also indicate an error inside Unity itself.)</para>
    /// </summary>
    Assert,
    /// <summary>
    ///   <para>LogType used for Warnings.</para>
    /// </summary>
    Warning,
    /// <summary>
    ///   <para>LogType used for regular log messages.</para>
    /// </summary>
    Log,
    /// <summary>
    ///   <para>LogType used for Exceptions.</para>
    /// </summary>
    Exception,
}

使い方

public class Test : MonoBehaviour
{
    [SerializeField] private Text text;

    private void Start()
    {
        Application.logMessageReceived += (condition, stackTrace, type) =>
        {
            text.text += $"[{type}] {condition} : {stackTrace}";
        };
        
        Debug.Log("Debug.Log");
        Debug.LogWarning("Debug.LogWarning");
        
        Debug.Assert(true, "これは表示されない");
        Debug.Assert(false, "Debug.Assert");
        
        Debug.LogError("Debug.LogError");
        Debug.LogException(new Exception("Debug.LogException"));
    }
}
サンプルを動作させた様子