LoginSignup
11
7

More than 5 years have passed since last update.

Unityで ログごとにスタックトレースの有無を切り替える

Last updated at Posted at 2018-12-09

この記事は Unity #2 Advent Calendar 2018 9日目の記事です。

ログごとにスタックトレースの有無を切り替える

Unityに限らずバグ調査でスタックトレースは大変重宝しますが、 UnityEngine.Debug クラスが出力するスタックトレースは冗長です。そのため logcat 等では実機ログがものすごい速度で流れてしまい……。
ログによってはスタックトレースは不要なので、切り替えられるようにします。

Application.SetStackTraceLogType

UnityEngine.Application.SetStackTraceLogType 関数で、以降のログ出力のスタックトレース情報を変更することができます。

サンプルコード

Debug.cs
public static class Debug
{
    public static void LogError(object message, UnityEngine.StackTraceLogType stackTraceType = UnityEngine.StackTraceLogType.ScriptOnly)
    {
        LogInternal(UnityEngine.LogType.Error, message, stackTraceType);
    }

    public static void LogWarning(object message, UnityEngine.StackTraceLogType stackTraceType = UnityEngine.StackTraceLogType.ScriptOnly)
    {
        LogInternal(UnityEngine.LogType.Warning, message, stackTraceType);
    }

    public static void Log(object message, UnityEngine.StackTraceLogType stackTraceType = UnityEngine.StackTraceLogType.ScriptOnly)
    {
        LogInternal(UnityEngine.LogType.Log, message, stackTraceType);
    }

    private static void LogInternal(UnityEngine.LogType logType, object message, UnityEngine.StackTraceLogType stackTraceType)
    {
        var currentStackTraceType = UnityEngine.Application.GetStackTraceLogType(logType);
        if (currentStackTraceType != stackTraceType)
        {
            UnityEngine.Application.SetStackTraceLogType(logType, stackTraceType);
        }

        switch (logType)
        {
            case UnityEngine.LogType.Error:
                UnityEngine.Debug.LogError(message);
                break;

            case UnityEngine.LogType.Warning:
                UnityEngine.Debug.LogWarning(message);
                break;

            case UnityEngine.LogType.Log:
                UnityEngine.Debug.Log(message);
                break;
        }

        if (currentStackTraceType != stackTraceType)
        {
            UnityEngine.Application.SetStackTraceLogType(logType, currentStackTraceType);
        }
    }
}
Main.cs
using UnityEngine;

public class Main : MonoBehaviour
{
    void Start()
    {
        Debug.Log("スタックトレースあり");
        Debug.Log("スタックトレースなし", StackTraceLogType.None);
    }
}

実行結果

StackTraceLogType.None を指定した方は、スタックトレースがないことが確認できます。
ログごとにスタックトレースの有無を切り替える スクリーンショット
キャプチャ2.PNG

11
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
7