using Newtonsoft.Json; using System; using System.IO; using System.Text; using UnityEngine; namespace XRTool.Util { public enum LogLevel { NO = 0, Low = 1, Middle = 2, High = 3, Max = 4 } /// /// 日志输出,请勿使用Debug或者Print等自带的日志 /// 日志分级,普通日志,错误日志,异常日志 /// debug模式可以输出普通日志,其他日志必输出 /// 通过配置参数实现不同的日志等级 /// 为了避免大量日志输出,采用优化方案写入日志 /// public static class UnityLog { private static string logBuilder; private static FileStream logStream; private static FileStream errorStream; private static FileStream exceptStream; public static event Action MessageReceived; /// /// 在编辑器中是否输出日志文件 /// public static bool isOutLogEditor = true; /// /// 日志等级,默认为1,正式发布版本为0 /// 等级越高代表可输出的日志越多 /// public static int logLevel = 1; public const string NULL = "null"; private static bool isFristLog = true; private static bool isFristLogError = true; private static bool isFristLogExcept = true; private static string logPath; public static FileStream LogStream { get { if (logStream == null) { logStream = new FileStream(Path.Combine(LogPath, "log.txt"), FileMode.Append); } return logStream; } } public static FileStream ErrorStream { get { if (errorStream == null) { errorStream = new FileStream(Path.Combine(LogPath, "error.txt"), FileMode.Append); } return errorStream; } } public static FileStream ExceptStream { get { if (exceptStream == null) { exceptStream = new FileStream(Path.Combine(LogPath, "except.txt"), FileMode.Append); } return exceptStream; } } public static string LogPath { get => logPath; set => logPath = value; } static UnityLog() { /* if (BuildConfigMgr.Instance.IsInit) { }*/ //LogPath = Path.Combine(BuildConfig.Instance.UserPath, "LogData"); LogPath = Path.Combine(Application.persistentDataPath, "LogData"); if (!Directory.Exists(LogPath)) { Directory.CreateDirectory(LogPath); } else { ///缓存文件最大只留10M,超过10M后,清除日志 DirectoryInfo di = new DirectoryInfo(LogPath); long len = 0; foreach (FileInfo item in di.GetFiles()) { len += item.Length; } if (len > 10 * UnityUtil.MB) { Directory.Delete(LogPath, true); } Directory.CreateDirectory(LogPath); } Application.logMessageReceived += LogMessageReceived; //InitLog(); } /// /// 接受系统日志 /// /// /// /// private static void LogMessageReceived(string condition, string stackTrace, LogType type) { if (!isOutLogEditor) { return; } logBuilder = null; FileStream fileStream = null; if (string.IsNullOrEmpty(condition) && string.IsNullOrEmpty(stackTrace)) { return; } bool isWriteFrist = false; #if UNITY_EDITOR || !BUILDTYPE_RELEASE //Release if (type == LogType.Log) { ///日志等级大于0时才会开启日志 if (logLevel >= 1) { fileStream = LogStream; } if (isFristLog) { isWriteFrist = true; isFristLog = false; } } #endif if (type == LogType.Exception) { fileStream = ExceptStream; if (isFristLogExcept) { isWriteFrist = true; isFristLogExcept = false; } } else if (type == LogType.Error) { fileStream = ErrorStream; if (isFristLogError) { isWriteFrist = true; isFristLogError = false; } } if (fileStream != null) { DateTime time = DateTime.Now; logBuilder = time + ": " + condition + stackTrace + "\n"; MessageReceived?.Invoke(logBuilder); if (isWriteFrist) { /* if (BuildConfigMgr.Instance.IsInit) { ReleaseLog("\n----------Version Log------------\n" + Application.productName + "_" + Application.version + "_" + JsonConvert.SerializeObject(BuildConfig.Instance) + "\n", fileStream); }*/ } ReleaseLog(logBuilder, fileStream); fileStream.Flush(); } fileStream = null; logBuilder = null; } /// /// 释放资源 /// public static void ReleaseLog() { Application.logMessageReceived -= LogMessageReceived; if (logStream != null) { logStream.Close(); } if (errorStream != null) { errorStream.Close(); } if (exceptStream != null) { exceptStream.Close(); } logStream = null; errorStream = null; exceptStream = null; } public static void Log(object log, int level = 1) { //Log(log != null ? log.ToString() : "null", logLevel); ///如果是编辑器模式或者非商用APP版本,可以打日志文件 #if UNITY_EDITOR || !BuildType_RELEASE //Release bool isForce = false; #if UNITY_EDITOR isForce = logLevel >= 4; #endif if (isForce || level <= logLevel) { Debug.Log(log != null ? log.ToString() : NULL); } #endif } /// /// 正常的日志输出 /// public static void Log(string log, int level = 1) { ///如果是编辑器模式或者非商用APP版本,可以打日志文件 #if UNITY_EDITOR || !BuildType_RELEASE //Release bool isForce = false; #if UNITY_EDITOR isForce = logLevel >= 4; #endif if (isForce || level <= logLevel) { Debug.Log(log); } #endif } /// /// 错误日志输出 /// public static void LogError(string log, int logLevel = 1) { ///错误日志任何模式都会输出 Debug.Log(log); } /// /// 错误日志输出 /// public static void LogException(Exception ex, int level = 1) { ///异常日志由系统自动输出 Debug.LogException(ex); } /// /// 日志输出,替换对应的日志文件 /// public static void Log(string log, LogType logType, int logLevel = 1) { if (logType == LogType.Log) { Log(log, logLevel); } else if (logType == LogType.Error) { LogError(log, logLevel); } } /// /// 释放资源 /// public static void ReleaseLog(string msg, FileStream stream) { if (!string.IsNullOrEmpty(msg)) { WriteLogToFile(msg, stream); } } /// /// 将日志写入到文件中 /// /// /// public static void WriteLogToFile(string log, FileStream stream) { if (stream != null) { ///UTF8的编码格式转化成byte字节流 byte[] buttf = Encoding.Default.GetBytes(log); stream.Write(buttf, 0, log.Length); } } public static void ClearAllLog() { ReleaseLog(); if (Directory.Exists(LogPath)) { Directory.Delete(LogPath, true); } Directory.CreateDirectory(LogPath); //InitLog(FileMode.Create); } } }