Work Time Manager【开源项目】- 创建自己日志组件 2.0重构
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 = ;// 10s static 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 == )
{
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 = ; var lineNum = LogQueue.Count > onceTime ? onceTime : LogQueue.Count; for (var i = ; 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 。
当然,期待你们更好的建议,大家一起学习,你有好的想法,自己又不想写,我来帮你实现!
欢迎大家狂喷,只有批评才是前进最好的动力!
同时:WorkTimeManager的在线API 即将开放,欢迎各位开发者开发对应的周边应用哦!
敬请关注:http://api.timemanager.online/
Work Time Manager【开源项目】- 创建自己日志组件 2.0重构的更多相关文章
- 小程序官网CMS开源项目出炉,Weixin-App-CMS 1.0 版本正式发布
Weixin-App-CMS 是捷微团队开发的微信小程序CMS开源项目,涵盖了微网站的基本功能,能够快速发布简单易用的小程序网站.采用工具“微信web开发”上传小程序,即可快速体验发布体验小程序网站. ...
- 开源项目——小Q聊天机器人V1.0
小Q聊天机器人V1.0 http://blog.csdn.net/baiyuliang2013/article/details/51386281 小Q聊天机器人V1.1 http://blog.csd ...
- 这年头做开源项目,被冷嘲热讽,FreeSql 0.0.4
FreeSql 项目大概在20天前想着要做的,今天发布0.0.4在群里被一位大神讽刺. 这位无名氏哥们的观点,先声明这不是找安慰的文章,更加不是报复打击的目的. 1 所以这个比EF好在哪里 2 毕竟E ...
- 开源项目大全 >> ...
http://www.isenhao.com/xueke/jisuanji/kaiyuan.php 监控系统-Nagios 网络流量监测图形分析工具-Cacti 分布式系统监视-zabbix 系统 ...
- android开源项目学习
FBReaderJ FBReaderJ用于Android平台的电子书阅读器,它支持多种电子书籍格式包括:oeb.ePub和fb2.此外还支持直接读取zip.tar和gzip等压缩文档. 项目地址:ht ...
- GitHub上最受欢迎的Android开源项目TOP20
以下这些开源项目都是从GitHub上筛选的,我强烈推荐android程序源代码有时间的时候自己在上面淘淘,或许能发现自己须要的开源程序. 了解开源项目有两个优点: 1.借鉴代码,一般来说.火爆的开源项 ...
- 打造一个高逼格的android开源项目——小白全攻略 (转)
转自:打造一个高逼格的android开源项目 小引子 在平时的开发过程中,我们经常会查阅很多的资料,最常参考的是 github 的开源项目.通常在项目的主页面能看到项目的简介和基本使用,并且时不时能看 ...
- Android开源项目汇总
Android很多优秀的开源项目,很多UI组件以及经典的HTTP 访问开源,都能给我们带来一些自己项目的启迪或者引用. 下面简单介绍一下自己收藏的一些项目内容. 项目: Apollo音乐播放器:And ...
- ASP.NET Core可视化日志组件使用
前言 今天站长推荐一款日志可视化组件LogDashboard,可以不用安装第三方进程,只需要在项目中安装相应的Nuget包,添加数行代码,就可以实现拥有带Web页面的日志管理面板,十分nice哦. 下 ...
随机推荐
- 新型钓鱼手段预警:你看到的 аррӏе.com 真是苹果官网?
研究人员发现一种"几乎无法检测"的新型钓鱼攻击,就连最细心的网民也难以辨别.黑客可通过利用已知漏洞在 Chrome.Firefox 与 Opera 浏览器中伪造显示合法网站域名(例 ...
- 清北Day 2
清北第二天,感受到了来自这个世界的不友善,大概把没听过不会的"名词"记录下来就已经一面了,然后被大佬说这都是最基础的东西,就很皮,那就趁别人练习字符串的题的时候,来写波博客了,倒不 ...
- 通过bootloader向内核传输启动参数
作者:Younger Liu,本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. Linux提供了一种通过bootloader向其传输启动参数的功能,内核开发者 ...
- <JAVA>可变参数列表
这是java1.5版本的新特性,就是当你想定义一个方法,但是不知道以后要用的时候传几个参数进去,这时可以在方法的参数列表中这样写(参数类型... 数组名),然后在方法内部直接用操作数组的方式操作.比如 ...
- JS判断当前手机类型
window.onload = function () { var u = navigator.userAgent; if (u.indexOf('Android') > -1 || u.ind ...
- html页面顶部出现一段空白,检查控制台发现body 下出现字符,原因及解决办法
html页面顶部出现一段空白,检查控制台发现body 下出现字符,原因及解决办法 分析: 原来是页面编码时增加了BOM,此页面后端数据主要是PHP语言,对PHP来讲PHP在设计时 ...
- Oracle树形结构查询之prior的理解
--1 建表 create table 宇宙( 行星等级 number ,行星名称 varchar2(50) ,上级行星等级 number); --2 数据准备 insert into 宇宙 (行星等 ...
- 增强for循环 -- foreach循环
1 作用 简化迭代器的书写格式.(注意:foreach循环的底层还是使用了迭代器遍历.) 2 适用范围 如果是实现了Iterable接口的对象或者是数组对象都可以使用foreach循环. 3 格 ...
- Redis学习-LUA脚本
最近在做K线的项目中,需要计算商品的分时数据.为了保证多台机器对同一商品的计算的有序性,所以在Redis中进行计算,同时为了保证在分时数据计算过程的原子性所以使用了LUA脚本,Redis内置了对LUA ...
- 又是一个MVP+RxJava+Retrofit的干货集中营
欢迎访问我的个人博客 ,未经允许不得转发 前言 今天想要与大家一起分享的是近一个星期内开发的一个新app--干货集中营客户端,其实网上已经有许多类似的项目,代码家也在他的干货集中营中推荐了几款优秀的作 ...