.NET封装一个简单的单例模式异步的日志类

news/2024/4/19 0:58:29

.NET兼职社区
可以直接使用,防止重复造轮子。

using System.IO;
using System;
using System.Threading.Tasks;namespace Wpf.PersonnelNotice.Servers
{public sealed class LogService{private static readonly Lazy<LogService> lazy =new Lazy<LogService>(() =>{return new LogService();});public static LogService Instance { get { return lazy.Value; } }private string LogDirectory { get; set; }private string TimeDirName { get; set; }private string LogFileName { get; set; }private string FirstLogFileName { get; set; }private const long maxLogSize = 2 * 1024 * 1024; // 2 MBprivate string newFileName { get; set; }private bool _isInitialized = false;private LogService(){// 初始化LogDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Log");TimeDirName = DateTime.Now.ToString("yyyyMMdd");FirstLogFileName = $"log_{DateTime.Now:yyyyMMddHHmmss}.txt";}public async Task WriteErrorLog(string message){EnsureInitialized();await WriteLog("Error", message);}public async Task WriteInfoLog(string message){EnsureInitialized();await WriteLog("Info", message);}private void EnsureInitialized(){if (!_isInitialized){CreatLogDir("Log");_isInitialized = true;}}public async Task WriteLog(string logType, string message){//创建文件夹string dirType = TimeDirName + "\\" + logType;CreatDir(dirType, LogDirectory);LogFileName = Path.Combine(LogDirectory, dirType, FirstLogFileName);if (!File.Exists(LogFileName)){using (StreamWriter sw = File.CreateText(LogFileName)){await sw.WriteLineAsync($"【{logType}{DateTime.Now} \r\n {message}  \r\n \r\n");}}else{FileInfo fileInfo = new FileInfo(LogFileName);if (fileInfo.Length > maxLogSize){string newFileName = $"log_{DateTime.Now:yyyyMMddHHmmss}.txt";FirstLogFileName = newFileName;LogFileName = Path.Combine(LogDirectory, dirType, newFileName);using (StreamWriter sw = File.CreateText(LogFileName)){await sw.WriteLineAsync($"【{logType}{DateTime.Now} \r\n {message}  \r\n \r\n");}}else{using (StreamWriter sw = File.AppendText(LogFileName)){await sw.WriteLineAsync($"【{logType}{DateTime.Now} \r\n {message}  \r\n \r\n");}}}}public static void CreatLogDir(string name){string rootDirectory = Directory.GetCurrentDirectory();Instance.CreatDir(name, rootDirectory);}// 将CreatDir方法改为非静态,因为在单例模式下由实例调用public bool CreatDir(string name, string path){if (string.IsNullOrEmpty(name)) throw new ArgumentNullException("name");if (string.IsNullOrEmpty(path)) throw new ArgumentNullException("path");string logPath = Path.Combine(path, name);// 判断文件夹是否存在if (!Directory.Exists(logPath)){// 在当前项目根目录创建一个新的文件夹Directory.CreateDirectory(logPath);return true;}return false;}}
}

// 使用示例

LogService.Instance.WriteErrorLog("This is an error message.");
LogService.Instance.WriteInfoLog("This is an info message.");

http://www.ppmy.cn/news/1394902.html

相关文章

我的风采——android studio

目录 实现“我的风采”页面要求理论代码生成apk文件 实现“我的风采”页面 要求 要求利用’java框架的边框布局实现“找的风采 ”页而&#xff0c;其中中间为你的生活照&#xff0c;左右和下面为按钮&#xff0c;上面为标签 理论 Java GUI编程是Java程序设计的重要组成部分…

Linux 进程通信:匿名管道、实现进程池

目录 一、进程间通信 1、 为什么需要进程通信 2、发展和分类 二、管道 1、概念 2、特点 2、复制并共享 3、用fork来共享管道原理 4、站在文件描述符角度-深度理解管道 5、站在内核角度-管道本质 三、匿名管道 1、概念 2、创建 3、snprintf 4、父子进程中进行单…

DNS服务器的分布式架构和集中式架构的区别

DNS服务器是域名系统的核心组件之一&#xff0c;用于解析域名和IP地址之间的映射关系。DNS服务器的架构形式有分布式和集中式两种模式。下面德迅云安全给您介绍DNS服务器的分布式架构和集中式架构的区别。 DNS服务器的分布式架构和集中式架构有什么区别&#xff1f; 1.分布式架…

34.网络游戏逆向分析与漏洞攻防-游戏网络通信数据解析-登录数据包的监视与模拟

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;33.游戏登录数据…

video/pdf文件预览与进度上传

video 视频文件直接使用video标签预览&#xff0c;和后端设定的是学员在观看视频时&#xff0c;前端会5秒钟上传一次进度&#xff0c;记录学员当前视频所学的进度&#xff0c;当视频观看完成时会立即触发一次进度上报接口。 <videoref"video":src"xxxxx&quo…

【无人机综合题】+题解

在没有遮挡的山地、水面、沙漠&#xff0c;那个对遥控的距离影响最大??(水面&#xff0c;因为飞机在一大片水体上飞行会产生下沉效应坐飞机限制携带的电池容量是多少?坐飞机限制携带的电池容量是160Wh.多旋翼机由几个部分组成?分】多旋翼机由机架、电调、电机、电池&#x…

Excel打开CSV文件中文乱码问题

Excel的数据导入功能 直接用Excel打开下载的CSV文件&#xff0c;会看到汉字乱码&#xff0c;数字显示正常。如下图所示现象。 请先正常打开一份空白的excel文件&#xff0c;将鼠标定位在第一行第一列&#xff0c;这边鼠标定位的位置将决定后续打开的csv文件在excel中展示的位置…

Android Audio相关

AudioManager AudioService的Bp端&#xff0c;调用AudioManager>AudioService&#xff08;代码实现&#xff09; AudioService 继承自IAudioService.Stub&#xff0c;为Bn端 AudioSystem AudioService功能实现都依赖于AudioSystem&#xff0c;AudioService通过AudioSys…

Mac电脑高清媒体播放器:Movist Pro for mac下载

Movist Pro for mac是一款专为Mac操作系统设计的高清媒体播放器&#xff0c;支持多种常见的媒体格式&#xff0c;包括MKV、AVI、MP4等&#xff0c;能够流畅播放高清视频和音频文件。Movist Pro具有强大的解码能力和优化的渲染引擎&#xff0c;让您享受到更清晰、更流畅的观影体…

mac安装openresty

官方地址&#xff1a;https://openresty.org/cn/download.html brew update brew install pcre openssl下载源码 https://openresty.org/download/openresty-1.25.3.1.tar.gz解压源码 tar -zxvf openresty-1.25.3.1.tar.gz进入解压后的目录 ./configure --prefix/opt/openr…

关于使用TCP-S7协议读写西门子PLC字符串的问题

我们可以使用TCP-S7协议读写西门子PLC&#xff0c; 比如PLC中定义一个String[50] 的地址DB300.20 地址DB300.20 DB块编号为300&#xff0c;偏移量【地址】是30 S7协议是西门子PLC自定义的协议&#xff0c;默认端口102&#xff0c;本质仍然是TCP协议的一种具体实现&#xff…

微服务跨域问题|The ‘Access-Control-Allow-Origin‘ header contains multiple values

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 参考 Spring Cloud Gateway CORS 方案看这篇就够了-腾讯云开发者社区-腾讯云 九种跨域方式实现原理&…

【MySQL】MySQL小结

MySQL数据库的基本信息 数据&#xff1a;记录事物的信息 表&#xff1a;数据的集合&#xff0c;由行和列组成&#xff1b;将多条数据组合在一起 数据库&#xff1a;是表的集合&#xff0c;是存储以统一格式且相互有关数据的仓库 DBMS的主要功能&#xff1a;1.数据库的建立和维…

Java毕业设计-基于springboot开发的网吧管理系统-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统登录2、管理员功能模块3、网管功能模块4、会员功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的…

馆室一体化查档平台制度有哪些

馆室一体化查档平台制度是指图书馆或档案馆在数字化和信息化的背景下&#xff0c;建立起的集查阅、借阅、咨询、文献传递等多项功能于一体的平台制度。下面是一些常见的馆室一体化查档平台制度&#xff1a; 1. 馆藏管理制度&#xff1a;包括图书和档案的采购、编目、分类、整理…

R语言Meta分析核心技术:回归诊断与模型验证

R语言作为一种强大的统计分析和绘图语言&#xff0c;在科研领域发挥着日益重要的作用。其中&#xff0c;Meta分析作为一种整合多个独立研究结果的统计方法&#xff0c;在R语言中得到了广泛的应用。通过R语言进行Meta分析&#xff0c;研究者能够更为准确、全面地评估某一研究问题…

Java项目中的web.xml文件的作用?

Java项目中的web.xml文件是Java Web应用程序的核心配置文件,它是根据Java Servlet规范定义的部署描述符(Deployment Descriptor)。在传统的Servlet/JSP应用中,web.xml文件位于Web应用的WEB-INF目录下,用于配置Web应用的行为和组件设置,具体作用包括但不限于以下几点: 配…

Javascript由浅到深

关注我&#xff0c;持续分享逻辑思维&管理思维&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导&#xff1b; 有意找工作的同学&#xff0c;请参考博主的原创&#xff1a;《面试官心得--面试前应该如何准备》&#xff0c;《面试官心得--面试时如何进行自…

二叉树的遍历及线索二叉树试题解析

一、单项选择题 01.在下列关于二叉树遍历的说法中&#xff0c;正确的是( C ). A.若有一个结点是二叉树中某个子树的中序遍历结果序列的最后一个结点&#xff0c;则它一定是该子树的前序遍历结果序列的最后一个结点 B.若有一个结点是二叉树中某个子树的前序遍历结果序列的最后一…

【云开发笔记No.14】持续交付、持续部署、持续交付流水线

一、持续交付 持续交付&#xff08;Continuous Delivery&#xff09;是一种软件开发方法论&#xff0c;它强调在开发过程中&#xff0c;软件可以在任何时间以最小的努力被部署到生产环境。其核心是确保代码更改在经过一系列自动化测试后&#xff0c;能够快速、安全地集成到主代…