C# 异步日志记录类,方便下次使用,不用重复造轮子

先定义接口类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 异常
{internal interface ILog{Task WriteErrorLog(string message);Task WriteInfoLog(string message);Task WriteLog(string logType, string message);}
}

在去实现:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 异常
{internal class Log : ILog{public string LogDirectory { get; set; }public string TimeDirName { get; set; }private  string LogFileName { get; set; }private const long maxLogSize = 2*1024*1024; // 2 MBprivate string FirstLogFileName { get; set; }public Log() {//在根目录创建Log文件夹IOTools.CreatLogDir("Log");//初始化LogDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Log");TimeDirName = DateTime.Now.ToString("yyyyMMdd");FirstLogFileName = $"log_{DateTime.Now:yyyyMMddHHmmss}.txt";}public async Task WriteErrorLog(string message){await WriteLog("Error",message);}public async Task WriteInfoLog(string message){await WriteLog("Info", message);}public async Task WriteLog(string logType ,string message){//创建文件夹string dirType = TimeDirName + "\\" + logType;IOTools.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";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");}}}}}
}

工具类:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;namespace 异常
{internal  class IOTools{public static void CreatLogDir(string name){string rootDirectory = Directory.GetCurrentDirectory();CreatDir(name, rootDirectory);}public static void 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);}}}
}

最后实现的效果,简洁明了
如图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

MySQL索引下推:提升数据库性能的关键优化技术

文章目录 前言索引下推原理MySQL 基础架构传统查询过程ICP 查询过程 使用场景限制参数配置索引下推开启状态查询索引下推开启和关闭 一些问题只有联合索引才能使用索引下推?下面的查询为什么不走索引下推 参考 前言 大家好,我是 Lorin ,今天…

C语言从文件 D://test.txt 读取字符串,将字符串中所有的大写字符改为小写字母并写回到源文件中

完整代码&#xff1a; /*从文件 D://test.txt 读取字符串&#xff0c;将字符串中所有的大写字母改为小写字母并写回 到源文件中*/ #include<stdio.h>//将字符串中所有的大写字母改为小写字母 void func(char *buff){while (*buff!\0){if (*buff>A&&*buff<…

java基础-数据类型

1、变量 变量就是申请内存来存储值。也就是说&#xff0c;当创建变量的时候&#xff0c;需要在内存中申请空间。 内存管理系统根据变量的类型为变量分配存储空间&#xff0c;分配的空间只能用来储存该类型数据。 因此&#xff0c;通过定义不同类型的变量&#xff0c;可以在内…

【C#学习】button:只显示图片

第一步&#xff1a;设置按钮背景图片&#xff0c;并且图片随按钮大小变化 第二步&#xff1a;设置按钮使之只显示图片 button1.FlatStyle FlatStyle.Flat;//stylebutton1.ForeColor Color.Transparent;//前景button1.BackColor Color.Transparent;//去背景button1.FlatAppe…

破解tomcat密码并上传webshell

tomcat基础认证爆破 暴力破解 进入vulnhub的tomcat8目录&#xff0c;启动环境 由于tomcat密码默认最大尝试错误次数为5次&#xff0c;需要修改server.xml&#xff0c;修改下面字段 failureCount"10000000000" lockOutTime"0"tomcat默认界面&#xff0c;…

MATLAB仿真通信系统的眼图

eyediagram eyediagram(complex(used_i,used_q),1100)

Spring Framework中的依赖注入:构造器注入 vs. Setter注入

前言 构造器注入和Setter注入是依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;中两种常见的方式&#xff0c;用于向一个对象注入其所依赖的其他对象或数值。这两种注入方式有各自的特点和用途。 构造器注入&#xff08;Constructor Injection&#xff…

【LeetCode刷题-滑动窗口】-- 643.子数组最大平均数I

643.子数组最大平均数I 方法&#xff1a;滑动窗口 class Solution {public double findMaxAverage(int[] nums, int k) {int n nums.length;int winSum 0;//先求出第一个窗口的和for(int i 0;i<k;i){winSum nums[i];}//通过遍历求出除了第一窗口的和int res winSum;fo…

抖斗音_快块手直播间获客助手+采集脚本+引流软件功能介绍

软件功能&#xff1a; 支持同时采集多个直播间&#xff0c;弹幕&#xff0c;关*注&#xff0c;礼*物&#xff0c;进直播间&#xff0c;部分用户手*号,粉*丝团采集 不支持采集匿*名直播间 设备需求&#xff1a; 电脑&#xff08;win10系统&#xff09; 文章分享者&#xff1…

28 nacos多环境配置共享

1.3.配置共享 其实微服务启动时&#xff0c;会去nacos读取多个配置文件&#xff0c;例如&#xff1a; [spring.application.name]-[spring.profiles.active].yaml&#xff0c;例如&#xff1a;userservice-dev.yaml [spring.application.name].yaml&#xff0c;例如&#xff…

双十一电视盒子哪个牌子好?测评工作室整理口碑电视盒子排名

在挑选电视盒子的时候&#xff0c;新手朋友们不知道从何下手&#xff0c;最近很多粉丝评论想要我们分享双11电视盒子推荐&#xff0c;于是我们根据用户的评价整理了目前口碑最好的电视盒子排名&#xff0c;给不懂电视盒子哪个牌子好的朋友们做个参考。 TOP 1、泰捷WEBOX WE40S电…

Flutter的Widget, Element, RenderObject的关系

在Flutter中&#xff0c;Widget&#xff0c;Element和RenderObject是三个核心的概念&#xff0c;它们共同构成了Flutter的渲染流程和组件树的基础。下面简要介绍它们之间的关系&#xff1a; 1.Widget Widget是Flutter应用中的基础构建块&#xff0c;是一个配置的描述&#xf…