当前位置: 首页 > news >正文

C# 手动写入日志,过大写入新文件

老项目没有用logf4j等日志框架,使用的是手动写入文件的方式存储日志。当日志过大会出现写入缓慢问题。下面采用IO异步写入以及文件过大分片等方式解决问题。

private static readonly object _lock = new object();
private const long MaxFileSize = 10 * 1024 * 1024; // 10MBpublic void SaveTextAsync(string data, string ex, string methods)
{try{DateTime date = DateTime.Now;string logData = date.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n" + data + "\r\n" + ex;string strDate = date.ToString("yyyyMMdd");string strDateTxt = strDate + ".txt";string programPath = AppDomain.CurrentDomain.BaseDirectory.Substring(0, 2);string logDir = Path.Combine(programPath + "", "\\MESBUG", strDate, methods);lock (_lock){if (!Directory.Exists(logDir)){Directory.CreateDirectory(logDir);}// 获取当前最新的日志文件string filePath = GetLatestLogFile(logDir, strDate);// 检查文件大小并切割filePath = CheckFileSizeAndRotate(filePath, logDir, strDate);byte[] logDataBytes = System.Text.Encoding.UTF8.GetBytes(logData + Environment.NewLine);FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.None, 4096, true);// 异步写入fs.BeginWrite(logDataBytes, 0, logDataBytes.Length, new AsyncCallback(EndWriteCallback), fs);}}catch (Exception ex2){return;}}// 获取日志目录中最新的日志文件
private string GetLatestLogFile(string logDir, string strDate)
{// 获取日志目录下所有日志文件,按文件名排序var logFiles = Directory.GetFiles(logDir, $"{strDate}_*.txt").OrderByDescending(f => f).FirstOrDefault();if (logFiles == null){// 如果没有找到分片日志文件,则返回默认的日志文件路径return Path.Combine(logDir, strDate + ".txt");}return logFiles;
}// 检查文件大小并切割日志文件
private string CheckFileSizeAndRotate(string filePath, string logDir, string strDate)
{FileInfo fileInfo = new FileInfo(filePath);// 如果文件超过指定大小,则创建新文件if (fileInfo.Exists && fileInfo.Length > MaxFileSize){string newFileName = $"{strDate}_{DateTime.Now.ToString("HHmmss")}.txt";return Path.Combine(logDir, newFileName);}return filePath;
}private void EndWriteCallback(IAsyncResult ar)
{FileStream fs = (FileStream)ar.AsyncState;fs.EndWrite(ar);fs.Close();
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 走进低代码表单开发(三):高效业务功能构建
  • 构建高效入学审核系统:Spring Boot解决方案
  • 【经验技巧】瞬态信号仿真中的码型选择问题
  • Windows桌面整理软件哪个最好?值得一试的Top10桌面管理软件汇总(全新)
  • 斯坦福研究人员探讨大型语言模型在社交网络生成中的应用及其在政治同质性上的偏见
  • Gin-封装自动路由
  • InstantMesh模型构建指南
  • Vue:通过js控制css变量 - 一键修改全局样式
  • 深度学习实践:理解理论背后的机制,体会理论与实际应用中的差距
  • 如何编写Prompt,利用AI高效生成图表——图表狐(FoxChart)指南
  • 设计模式-行为型模式-备忘录模式
  • Vue3如何查看项目是否安装了vue-router路由依赖,及安装方法
  • 数据结构与算法-17高级数据结构_图论(迪杰斯特拉算法)
  • 《黑神话:悟空》本地存档误删了怎么恢复?三种方法!
  • PHP7 json_encode() 浮点小数溢出错误
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • magento 货币换算
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • PaddlePaddle-GitHub的正确打开姿势
  • Redis 中的布隆过滤器
  • SQL 难点解决:记录的引用
  • SQLServer插入数据
  • vue:响应原理
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 彻底搞懂浏览器Event-loop
  • 区块链将重新定义世界
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 线性表及其算法(java实现)
  • 优秀架构师必须掌握的架构思维
  • 进程与线程(三)——进程/线程间通信
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • #laravel 通过手动安装依赖PHPExcel#
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #QT(一种朴素的计算器实现方法)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (09)Hive——CTE 公共表达式
  • (1)Jupyter Notebook 下载及安装
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (接口自动化)Python3操作MySQL数据库
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (十一)手动添加用户和文件的特殊权限
  • ../depcomp: line 571: exec: g++: not found
  • .apk 成为历史!
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .Net Core 中间件与过滤器
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET企业级应用架构设计系列之应用服务器
  • .net中应用SQL缓存(实例使用)
  • .stream().map与.stream().flatMap的使用
  • @GlobalLock注解作用与原理解析
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [20150321]索引空块的问题.txt