Unity3D将LOG输出成文件的方法和崩溃卡死原因

   这篇文章,主要是记录我在用4.5的时候,将log输出成文件的时候,遇到的一个bug。

   先讲讲如何捕捉log信息,这个很简单,直接使用Unity自带的函数Application.RegisterLogCallback()就行。然后根据不同的平台,保存在不同的地方

直接上代码

	void Start () 
    {
        string path;
#if UNITY_EDITOR
        path = Application.dataPath;
#else
        path = Application.persistentDataPath;
#endif
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
        fileInfo = new FileInfo(path + "/log.txt");
        writer  = fileInfo.CreateText(); // 创建log文件

       Application.RegisterLogCallback(LogCallback);
	}
	
    void LogCallback(string condition, string stackTrace, LogType type)
    {
        writer.WriteLine(type.ToString());  // 该log的类型
        writer.Flush();

        writer.WriteLine("condition" + ": " + condition + "\n\r"); 
        writer.Flush();

        writer.WriteLine("stackTrace" + ": " + stackTrace + "\n\r");
        writer.Flush();
    }
    void OnDestroy()
    {
        writer.Close();
    }
这个方法在4.2之前都是没有问题的,逻辑也很简单,根据平台,选择路径创建一个log的文本(若存在,会被覆盖)。但在我更新到4.5之后,只段代码就出现问题了。

每次在编辑器运行时,创建输出LOG文件,只要一切换窗口,Unity就会崩溃。

后来排查了很久,发现,问题就出现在writer  = fileInfo.CreateText(); 这句代码上。

原来,CreateText这个函数的创建方式,对于文件的读写都是独占的,这就带来了一个问题,因为在切换Unity的编辑器窗口后,会对Asset文件夹下的所有修改的资源进行重新读取导入。而我所创建的Log文件就是保存在Asset文件夹的下,因此,一切换窗口,Unity就去读取log文件的信息,而此时log文件又被代码脚本给独占了读取权限,因此Unity就无法读取到文件,卡死在那里。

改良后的版本

    FileInfo fileInfo;
    FileStream writer;
    System.Text.UTF8Encoding encoding;
    string content = "";
	// Use this for initialization
    void Start() 
    {
        string path;
#if UNITY_EDITOR
        path = Application.dataPath;
#else
        path = Application.persistentDataPath;
#endif
        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }
        fileInfo = new FileInfo(path + "/log.txt");
        if (fileInfo.Exists)
        {
            fileInfo.Delete();
        }

        writer = fileInfo.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
        encoding = new System.Text.UTF8Encoding();
        Application.RegisterLogCallback(LogCallback);
	}
	
    void LogCallback(string condition, string stackTrace, LogType type)
    {
        string content = type.ToString() + ": " + "\n\r" +
            "condition" + ": " + condition + "\n\r" +
            "stackTrace" + ": " + stackTrace + "\n\r" +
            "--------------------------------------" + "\n\r";
        writer.Write(encoding.GetBytes(content), 0, encoding.GetByteCount(content));
        writer.Flush();
    }
    void OnDestroy()
    {
        writer.Close();
        Application.RegisterLogCallback(null);
    }



你可能感兴趣的:(Unity3D)