119 lines
3.4 KiB
C#
119 lines
3.4 KiB
C#
using System;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using UnityEngine;
|
||
using System.IO;
|
||
using System.Linq;
|
||
|
||
namespace GeneralTools
|
||
{
|
||
public class FileDebug : SingletonBaseAttribute<FileDebug>
|
||
{
|
||
FileStream fileStream_log;
|
||
StreamWriter streamWrite_log;
|
||
|
||
Queue<LogItem> logQue = new Queue<LogItem>();
|
||
|
||
string dirPath = "";
|
||
public override void IAwake()
|
||
{
|
||
if (ConfigHelper.saveLog)
|
||
{
|
||
CreateTxt();
|
||
Application.logMessageReceived += LogHandler;
|
||
}
|
||
}
|
||
private void CreateTxt()
|
||
{
|
||
dirPath = DevicePath.CurrentDirectory + "/Log";
|
||
|
||
if (!Directory.Exists(dirPath))
|
||
Directory.CreateDirectory(dirPath);
|
||
|
||
string fileName_log = dirPath + "/" + DateTime.Now.ToString("yyyyMMddHHmmss") + "----" + "log" + ".txt";
|
||
fileStream_log = new FileStream(fileName_log, FileMode.OpenOrCreate, FileAccess.ReadWrite);
|
||
streamWrite_log = new StreamWriter(fileStream_log);
|
||
|
||
CheckLogFileNum(dirPath, 20);
|
||
}
|
||
public override void IOnApplicationQuit()
|
||
{
|
||
if (ConfigHelper.saveLog)
|
||
{
|
||
streamWrite_log.Close();
|
||
fileStream_log.Close();
|
||
Application.logMessageReceived -= LogHandler;
|
||
}
|
||
}
|
||
private void LogHandler(string condition, string stackTrace, LogType type)
|
||
{
|
||
logQue.Enqueue(new LogItem()
|
||
{
|
||
messageString = condition,
|
||
stackTrace = stackTrace,
|
||
logType = type,
|
||
time = DateTime.Now
|
||
});
|
||
}
|
||
private void FixedUpdate()
|
||
{
|
||
if (logQue.Count > 0)
|
||
{
|
||
try
|
||
{
|
||
var item = logQue.Peek(); // 取队首元素但先不移除
|
||
var timeStr = item.time.ToString("HH:mm:ss.ff");
|
||
var logStr = string.Format("{0}-[{1}]{2}======>{3}", timeStr, item.logType, item.messageString, item.stackTrace);
|
||
streamWrite_log.WriteLine(logStr);
|
||
streamWrite_log.Flush();
|
||
logQue.Dequeue(); // 成功执行了再移除队首元素
|
||
}
|
||
catch (IOException ex)
|
||
{
|
||
Debug.Log(ex.Message);
|
||
}
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 删除多余的Log,
|
||
/// </summary>
|
||
/// <param name="path"></param>
|
||
/// <param name="maxNum"></param>
|
||
protected void CheckLogFileNum(string path, int maxNum)
|
||
{
|
||
List<string> pathList = Directory.GetFiles(path).ToList();
|
||
int deleteNum = pathList.Count - maxNum;
|
||
|
||
if (deleteNum > 0)
|
||
{
|
||
for (int i = 0; i < deleteNum; i++)
|
||
{
|
||
File.Delete(pathList[i]);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
public struct LogItem
|
||
{
|
||
/// <summary>
|
||
/// 日志内容
|
||
/// </summary>
|
||
public string messageString;
|
||
|
||
/// <summary>
|
||
/// 调用堆栈
|
||
/// </summary>
|
||
public string stackTrace;
|
||
|
||
/// <summary>
|
||
/// 日志类型
|
||
/// </summary>
|
||
public LogType logType;
|
||
|
||
/// <summary>
|
||
/// 记录时间
|
||
/// </summary>
|
||
public DateTime time;
|
||
}
|