using UnityEngine; using System.IO; using System.Collections; using System.Collections.Generic; using System.Threading; using System; public class LogInfo { public string message = null; public LogType type = 0; public LogInfo(string message, LogType type) { this.message = message; this.type = type; } } namespace LuaFramework { public class LogHandler : Base { #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN ConsoleWindows.ConsoleWindow console = new ConsoleWindows.ConsoleWindow(); ConsoleWindows.ConsoleInput input = new ConsoleWindows.ConsoleInput(); #endif private Thread thread; static readonly object m_lockObject = new object(); static readonly object m_lockObject2 = new object(); static Queue log_list = new Queue(); //日志输出路径 private string output_path = null; void Awake() { LogManager.RegisterLogCallback(delegate (string message, LogType type) { AddMessage(message, type); }); string log_dir = Util.DataPath + "/log"; if (!Directory.Exists(log_dir)) Directory.CreateDirectory(log_dir); output_path = log_dir + "/out_put.txt"; //每次启动先删除旧的 if (File.Exists(output_path)) { File.Delete(output_path); } #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN console.Initialize(); console.SetTitle("game log"); #endif thread = new Thread(OnUpdateThread); Application.logMessageReceived += HandleLog; } // Use this for initialization void Start() { thread.Start(); } public void AddMessage(string message, LogType type) { lock (m_lockObject2) { LogInfo li = new LogInfo(message, type); string day_str = System.DateTime.Now.Day.ToString()+"/"; string hour_str = System.DateTime.Now.Hour.ToString()+":"; string minute_str = System.DateTime.Now.Minute.ToString()+":"; string second_str = System.DateTime.Now.Second.ToString()+":"; li.message = day_str+hour_str+minute_str+second_str+li.message; log_list.Enqueue(li); } } //日志回调 void HandleLog(string message, string stackTrace, LogType type) { AddMessage(message, type); } //主线程update void Update() { #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN input.Update(); #endif } //多线程update void OnUpdateThread() { while (true) { lock (m_lockObject) { if (log_list.Count > 0) { LogInfo li = log_list.Dequeue(); #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN if (li.type == LogType.Warning) System.Console.ForegroundColor = System.ConsoleColor.Yellow; else if (li.type == LogType.Error || li.type == LogType.Exception) System.Console.ForegroundColor = System.ConsoleColor.Red; else System.Console.ForegroundColor = System.ConsoleColor.White; if (System.Console.CursorLeft != 0) input.ClearLine(); System.Console.WriteLine(li.message); #endif OnWriteFile(li.message); } } Thread.Sleep(1); } } void OnWriteFile(string message) { try { StreamWriter writer = new StreamWriter(output_path, true, System.Text.Encoding.UTF8); writer.WriteLine(message); writer.Close(); } catch(Exception e) { Debug.Log("write game log error :" + e.Message); } } void OnDestroy() { #if UNITY_EDITOR_WIN || UNITY_STANDALONE_WIN console.Shutdown(); #endif } } }