Unity3D 开发工具系列 日志系统:输出模块FileAppender
2023-09-11 14:19:57 时间
Unity3D 开发工具系列 日志系统:核心模块Logging
Unity3D 开发工具系列 日志系统:调用封装Log
Unity3D 开发工具系列 日志系统:输出模块ConsoleAppender
Unity3D 开发工具系列 日志系统:输出模块FileAppender
Unity3D 开发工具系列 日志系统:输出模块GUIAppender
Unity3D 开发工具系列 日志系统:输出模块MobileGUIAppender
Unity3D 开发工具系列 日志系统:输出模块WindowAppender
Unity3D 开发工具系列 日志系统:配置模块LogConfig
控制台输出
源代码
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using UnityEngine;
namespace Epitome.LogSystem
{
public class FileAppender : AsyncTask<FileAppender>, ILogAppender
{
protected const string TIME_FORMATER = "yyyy.MM.dd HH:mm:ss,fff";
string logRootPath;
// 10M
private int maxFileSize = 10 * 1024 * 1024;
private StreamWriter streamWriter;
private FileStream fileStream;
private string logFilePath;
protected virtual string LogFilePath
{
get { return logFilePath; }
set { logFilePath = value; }
}
private List<LogData> writeList;
private List<LogData> waitList;
private object lockObj;
private bool stopFlag;
private int fileCount;
private void Awake()
{
#if UNITY_EDITOR
logRootPath = Application.dataPath + "/Log";
#elif UNITY_STANDALONE_WIN
logRootPath = Application.dataPath + "/Log";
#elif UNITY_STANDALONE_OSX
logRootPath = Application.dataPath + "/Log";
#else
logRootPath = Application.persistentDataPath + "/Log";
#endif
fileCount = 0;
LogFilePath = Path.Combine(logRootPath, string.Format("{0}_{1}.log", DateTime.Now.ToString("yyyyMMdd"), fileCount));
if (File.Exists(LogFilePath))
{
fileStream = new FileStream(LogFilePath, FileMode.Append);
}
else
{
if (!Directory.Exists(logRootPath))
Directory.CreateDirectory(logRootPath);
fileStream = new FileStream(LogFilePath, FileMode.Create);
}
streamWriter = new StreamWriter(fileStream);
streamWriter.AutoFlush = true;
writeList = new List<LogData>();
waitList = new List<LogData>();
lockObj = new object();
stopFlag = false;
}
public void Log(LogData logData)
{
lock (lockObj)
{
waitList.Add(logData);
Monitor.PulseAll(lockObj);
}
}
public override void Close()
{
this.stopFlag = true;
if (null != this.fileStream)
{
this.fileStream.Close();
}
}
public override void Run()
{
Loom.RunAsync(() => {
while (!stopFlag)
{
lock (lockObj)
{
if (waitList.Count == 0)
{
Monitor.Wait(lockObj);
}
this.writeList.AddRange(this.waitList);
this.waitList.Clear();
}
for (int i = 0; i < writeList.Count; i++)
{
LogData logData = writeList[i];
Loom.QueueOnMainThread((object sd) =>
{
this.streamWriter.WriteLine(String.Format("[{0}] {1,-5}:{2}\r\n{3}", logData.logTime.ToString(TIME_FORMATER), logData.logLevel, logData.logMessage, logData.logBasicData));
if (logData.logTrack != null)
{
this.streamWriter.WriteLine(logData.logTrack + "\n");
}
}, 2);
HandleTriggerEvent();
}
}
});
}
private void HandleTriggerEvent()
{
if (this.fileStream.Length >= maxFileSize)
{
fileCount += 1;
LogFilePath = Path.Combine(logRootPath, string.Format("{0}_{1}.log", DateTime.Now.ToString("yyyyMMdd"), fileCount));
this.fileStream = new FileStream(LogFilePath, FileMode.Create);
this.streamWriter = new StreamWriter(this.fileStream);
this.streamWriter.AutoFlush = true;
}
}
}
}
相关文章
- ELK 日志系统
- gunicorn配置日志
- EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真
- 统一日志输出打印POST请求参数
- Spring AOP实现统一日志输出
- C/C++日志写入系统log(/var/log/syslog)
- 记一次CDH集群节点日志文件清理
- log4net日志组件经验分享
- CKA考试习题:K8S日志、监控与应用管理
- 135 日志监控告警系统案例(数据模型设计)
- 使用 MySQL 日志 | 慢速日志 - Part 3
- ELK+Filebeat+Kafka+ZooKeeper 构建海量日志分析平台
- [ELFK]日志分析系统搭建---Filebeat
- 《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》——02-05 项目进度(Time/Schedule)管理
- 《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》——02-07 项目质量(Quality)管理
- SuperSocket 中的日志系统
- linux系统重启 查看相关日志和历史记录
- MySQL二进制日志文件Binlog的三种格式以及对应的主从复制中三种技术
- ELK日志分析系统
- Unity3D 开发工具系列 日志系统:配置模块LogConfig
- 三个实例演示 Java Thread Dump 日志分析
- Linux搭建Promtail + Loki + Grafana 轻量日志监控系统
- sqlserver解决未能为数据库 ‘数据库名‘ 中的对象 ‘数据库日志文件‘ 分配空间,因为文件组 ‘PRIMARY‘ 已满。附带收缩数据库日志方法
- tensorflow日志信息如何屏蔽?
- MySQL - 日志系统