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();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/54020.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旺店通ERP集成用友BIP(旺店通主供应链)

源系统成集云目标系统 用友BIP介绍 用友BIP是以数智底座以及财务、人力、供应链、营销、采购、制造、研发、项目、资产、协同等数智化服务成就的数智平台,同时也预置了很多跨行业通用的SaaS服务,在营销、采购、制造、财务、人力、协同等核心业务领域提供…

Wophp靶场漏洞挖掘

首先进入网站发现有个搜索框,那么我们试一下xss和SQL注入 SQL注入漏洞 发现这里页面没有给我们回显 那么我们尝试sql注入 查数据库 查表 最后查出账号密码 找到账号密码之后我们去找后台登录 进入后台后发现这里有个flag flag 接着往下翻找到一个文件上传的地方 …

linux-L3-linux 复制文件

linux 中要将文件file1.txt复制到目录dir中,可以使用以下命令 cp file1.txt dir/复制文件 cp /path/to/source/file /path/to/destination移动 mv /path/to/source/file /path/to/destination复制文件夹内的文件 cp -a /path/to/source/file /path/to/destinati…

Python使用闭包,减少重复,实现计算不同函数运行时间效果

实现计算不同函数运行时间,最先想到的方法是在不同函数运行前后分别计时,然后后计算2者的时间差就可以了,然而代码就会有大量重复的计时语句,使用Python函数闭包的方法就可以快速解决这个问题,代码实现如下&#xff0c…

2024年开学季,有哪些大学宿舍必备好物?

随着2024年开学季的到来,新生们即将离开熟悉的家乡,踏入充满未知与挑战的大学生活。对于许多学子而言,宿舍不仅是他们未来几年的居住之所,更是承载青春记忆、实现自我成长的重要空间。为了帮助大家更好地适应校园生活,…

JavaScript高级——变量提升和函数提升

1、变量声明提升 —— 通过 var 定义(声明)的变量,在定义语句之前就可以访问到 —— 值:undefined 2、函数声明提升 —— 通过 function 声明的函数,在之前就可以直接调用 —— 值:函数定义&#xff0…

【PythonCode】力扣Leetcode41~45题Python版

【PythonCode】力扣Leetcode41~45题Python版 前言 力扣Leetcode是一个集学习、刷题、竞赛等功能于一体的编程学习平台,很多计算机相关专业的学生、编程自学者、IT从业者在上面学习和刷题。 在Leetcode上刷题,可以选择各种主流的编程语言,如C…

关于Redis缓存一致性问题的优化和实践

目录标题 导语正文分布式场景下无法做到强一致即使是达到最终一致性也很难缓存的一致性问题缓存是如何写入的 如何感知数据库的变化最佳实践一:数据库变更后失效缓存最佳实践二:带版本写入 总结与展望阿里XKV腾讯DCache 导语 Redis缓存一致性的问题是经…

023.PL-SQL进阶—视图

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :&#x1…

SAP Fiori-Vscode 环境搭建中npm报错

文章目录 前提: vscode 安装好了,node 配置完毕,npm环境搭建OK新建一个Fiori 初始化初始化性项目的报错&警告Q1: npm WARN config global --global, --local are deprecated. Use --locationglobal insteadQ2: npm打包出现警告&#xff0…

代码随想录算法训练营第五十八天 | 拓扑排序精讲-软件构建

目录 软件构建 思路 拓扑排序的背景 拓扑排序的思路 模拟过程 判断有环 写代码 方法一: 拓扑排序 软件构建 题目链接:卡码网:117. 软件构建 文章讲解:代码随想录 某个大型软件项目的构建系统拥有 N 个文件,文…

jsp+sevlet+mysql实验室设备管理系统2.0

jspsevletmysql实验室设备管理系统2.0 一、系统介绍二、功能展示1.控制台2.申购设备3.设备列表4.设备维护5.设备类型6.报废设备7.维修记录 四、其它1.其他系统实现 一、系统介绍 系统主要功能: 普通用户:控制台、申购设备、设备列表、设备维护、设备类型…

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为: dotnet 项目启动文件.dll --urls"ht…

会员计次卡渲染技术-—SAAS本地化及未来之窗行业应用跨平台架构

一、计次卡应用 1. 健身中心:会员购买一定次数的健身课程或使用健身房设施的权限。 2. 美容美发店:提供一定次数的理发、美容护理等服务。 3. 洗车店:车主购买若干次的洗车服务。 4. 儿童游乐场:家长为孩子购买固定次数的入场游…

Word使用手册

修改样式 编辑word文档时,标题和正文文本通常有不同的格式,如果能将这些格式保存为样式,下一次就能直接调用样式,而不需要重复手动设置格式。 可以将样式通常保存为不同的 样式模板.docx,要调用不同样式集&#xff0…

什么是科技与艺术相结合的异形创意圆形(饼/盘)LED显示屏

在当今数字化与创意并重的时代,科技与艺术的融合已成为推动社会进步与文化创新的重要力量。其中,晶锐创显异形创意圆形LED显示屏作为这一趋势下的杰出代表,不仅打破了传统显示设备的形态束缚,更以其独特的造型、卓越的显示效果和广…

【隐私保护】如何找出CLS方案的创新之处?

本文的写作动机是自己在写论文时对寻找创新点的一些思考,我想把寻找创新点的过程总结和概括成一套流程,从而变成一个思维工具,帮助我自己更好的看懂论文。由于本人水平有限,所以目前这套流程并不完善,这篇博文的作用自…

C++系列-STL中find相关的算法

STL中find相关的算法 💢find相关的算法💢💢find,find_if举例💢💢find_first_of举例💢💢find_end举例💢💢adjacent_find举例 秋词二首 刘禹锡刘禹锡〔唐代〕 …

使用python对股票市场进行数据挖掘的书籍资料有哪些

炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取…

golang学习笔记19——golang做服务发现与注册的深度剖析

推荐学习文档 golang应用级os框架,欢迎star基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总golang学习笔记01——基本数据类型golang学习笔记02——gin框架及基本原理golang学习笔记03——gin框架的核心数据结构golang学…