|
|
-
- 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<LogInfo> log_list = new Queue<LogInfo>();
-
- //日志输出路径
- 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
- }
- }
- }
|