Hello all , 我又回来了
这次我们真是开始来聊聊开源项目里,小而有用的模块或者组件的开发思想。
同时,软件已经更新到1.60的版本了,支持新用户注册,可以不再使用统一的test账户了。
您可以通过以下路径进行下载:
1、在GitHub上fellow一下项目,下载到本地,生成一下,即可获取最新版程序。
2、本地是beta v0.5版本的用户可以直接在程序右上角点击更新
3、最后给非微软系开发者的是以下的压缩包,直接解压即可使用。
如果你还不知道是什么软件,可以查看这篇博文:
【WPF MaterialDesign 示例开源项目】 Work Time Manager
今天,我们聊聊客户端的日志组件。
我也不知道说组件合不合适,反正就是属于软件一部分并且可以被重复利用的小模块我称之为组件。
这次的日志类就是很典型的一个组件,日志有很多特点;
1、会被使用在软件的任意一个地方
2、随时都会被调用
3、使用率极高
4、频繁的io操作
在我刚刚接触c#的时候,就使用过了Log4net,但是,那时候就萌生的想法是,我一个程序可能也才几m大小,一个日志组件就比上我一个主程序了,这明显是不合适的。
于是两年前还没有毕业的我着手做了自己的第一个日志组件。
【.net】创建属于自己的log组件——改进版
基础的思想还是好的,包括:线程,阻塞,资源竞争等都做了一定的考虑。
俗话说初生牛犊不怕虎,啥也不太知道的自己就这么开干了。
写了第一版通过开线程来做的日志组件。
可是,毕竟年轻,问题还是显而易见的。一秒打100条就不行了。
于是在我重新着手c#开发的时候,抽了点时间,来了一次重构。
using System;using System.Collections;using System.IO;using System.Text;using System.Threading;using System.Windows.Threading;namespace Helper
{public static class LogHelper
{private static readonly Queue LogQueue = new Queue();private static bool _isStreamClose = true;private static bool _isThreadBegin = false;private static StreamWriter _fileStreamWriter;private static readonly string fileName =@"BugLog.txt";static int _intervalTime = 10000;// 10sstatic System.Timers.Timer _timer = new System.Timers.Timer(_intervalTime);/// <summary>/// 添加日志队列/// </summary>/// <param name="message"></param>public static void AddLog(string message)
{string logContent = $"[{DateTime.Now:yyyy-MM-dd hh:mm:ss}] =>{message}";
LogQueue.Enqueue(logContent);if (!_isThreadBegin)
{
BeginThread();
}
}public static void AddLog(Exception ex)
{var logContent = $"[{DateTime.Now:yyyy-MM-dd hh:mm:ss}]错误发生在:{ex.Source},\r\n 内容:{ex.Message}";
logContent += $"\r\n 跟踪:{ex.StackTrace}";
LogQueue.Enqueue(logContent);if (!_isThreadBegin)
{
BeginThread();
}
}/// <summary>/// 读取日志队列的一条数据/// </summary>/// <returns></returns>private static object GetLog()
{return LogQueue.Dequeue();
}/// <summary>/// 开启定时查询线程/// </summary>public static void BeginThread()
{
_isThreadBegin = true;//实例化Timer类,设置间隔时间为10000毫秒; _timer.Interval = _intervalTime;
_timer.Elapsed += SetLog;//到达时间的时候执行事件; _timer.AutoReset = true;//设置是执行一次(false)还是一直执行(true); _timer.Enabled = true;
}/// <summary>/// 写入日志/// </summary>private static void SetLog(object source, System.Timers.ElapsedEventArgs e)
{if (LogQueue.Count == 0)
{if (_isStreamClose) return;
_fileStreamWriter.Flush();
_fileStreamWriter.Close();
_isStreamClose = true;return;
}if (_isStreamClose)
{
Isexist();string errLogFilePath = Environment.CurrentDirectory + @"\Log\" + fileName.Trim();if (!File.Exists(errLogFilePath))
{
FileStream fs1 = new FileStream(errLogFilePath, FileMode.Create, FileAccess.Write);
_fileStreamWriter = new StreamWriter(fs1);
}else{
_fileStreamWriter = new StreamWriter(errLogFilePath, true);
}
_isStreamClose = false;
}var strLog = new StringBuilder();var onceTime = 50;var lineNum = LogQueue.Count > onceTime ? onceTime : LogQueue.Count;for (var i = 0; i < lineNum; i++)
{
strLog.AppendLine(GetLog().ToString());
}
_fileStreamWriter.WriteLine(strLog.ToString());
}/// <summary>/// 判断是否存在日志文件/// </summary>private static void Isexist()
{string path = Environment.CurrentDirectory + @"\Log\";if (!File.Exists(path))
{
Directory.CreateDirectory(path);
}
}
}
}
代码没有第三方组件的应用,直接把这个文件复制即可使用。
现在暂时没有对一些特殊情况做处理,例如日志文件被占用、软件临时关闭,以及队列触发时间和批量写入个数等考虑,这只是一个最基础的demo,
当然,如果你想知道后续的改进方法,可以关注该项目的GitHub 。
当然,期待你们更好的建议,大家一起学习,你有好的想法,自己又不想写,我来帮你实现!
编辑推荐:
- C# 中十进制与二进制、十六进制、八进制转换详解02-21
- WPF MaterialDesign 示例开源项目介绍02-21
- 静态类02-21
- 详解用MicroService4Net 创建一个微服务的实例02-21
- 总结反射技术的实际应用。02-21
- VSCode轻松调试运行.Net 8.0 Web API项目的过程02-21
- 装箱与拆箱的实例教程02-21
- 用微信PC端dll库实现截图的实例代码02-21
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- C# 中十进制与二进制、十六进制、八进制转换详解
C# 中十进制与二进制、十六进制、八进制转换详解
26-02-21 - WPF MaterialDesign 示例开源项目介绍
WPF MaterialDesign 示例开源项目介绍
26-02-21 - 详解用MicroService4Net 创建一个微服务的实例
详解用MicroService4Net 创建一个微服务的实例
26-02-21 - 总结反射技术的实际应用。
总结反射技术的实际应用。
26-02-21 - VSCode轻松调试运行.Net 8.0 Web API项目的过程
VSCode轻松调试运行.Net 8.0 Web API项目的过程
26-02-21 - 用微信PC端dll库实现截图的实例代码
用微信PC端dll库实现截图的实例代码
26-02-21 - win10系统更新失败怎么办 解决win10新版本更新失败
win10系统更新失败怎么办 解决win10新版本更新失败
26-02-21 - ASP.NET MVC 遇到JSON循环调用的问题应该怎么解决?
ASP.NET MVC 遇到JSON循环调用的问题应该怎么解决?
26-02-21 - Win10版Office无法打开解决办法
Win10版Office无法打开解决办法
26-02-21 - vs 中引用的问题--出现小叹号
vs 中引用的问题--出现小叹号
26-02-21
