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哦. 下 ...
随机推荐
- GTK简单了解记录
GTK+http://zh.wikipedia.org/wiki/GTK%2B#.E5.9B.BE.E5.BD.A2.E6.97.A0.E5.85.B3.E4.BB.A3.E7.A0.81 GTK+最 ...
- linux 下 启动oracle
[root@csyang ~]# su - oracle #首先su到oracle用户 [oracle@csyang ~]$ sqlplus sys/passwd as sysdba #使用sys用户 ...
- 有些arp请求报文中为什么会有目的mac地址(不使用广播地址)
有些arp请求报文中为什么会有目的mac地址(不使用广播地址) 最近做实验,注意到局域网内大部分的arp包的以太网头部目的mac地址并不是广播地址,并且包内的目的mac地址字段并不是全0,而是目的ip ...
- lightoj1281快速幂+数学知识
https://vjudge.net/contest/70017#problem/E 后半部分快速幂就能求出来,要注意03lld不然001是输出错误为1.前半部分用log10() 对于给定的一个数n, ...
- 最大流算法之EK(最短路径增广算法)
这是网络流最基础的部分--求出源点到汇点的最大流(Max-Flow). 最大流的算法有比较多,本次介绍的是其中复杂度较高,但是比较好写的EK算法.(不涉及分层,纯粹靠BFS找汇点及回溯找最小流量得到最 ...
- 大数相加a+b
#include<stdio.h>#include<string.h>#define MAX 1000void Add(char *a,char *b,char *result ...
- Alsa 读取wave文件,并播放wave 文件
对于一个wave文件,如果需要播放,涉及到几个方面 1.对于wave文件的解析 2.通过解析wave文件,将得到的参数(主要是sampfrequency, bitsperSample,channel) ...
- Django入门笔记
Django入门笔记 **文档包含Django安装包.学习的笔记.代码等 安装 Django参考附件,只需要把附件拷贝到你需要的目录就行.Django是1.8.16版本 Python:在附件中,其中有 ...
- 转:Centos6.5_x86安装Redis。
Redis是一个高性能的,开源key-value型数据库.是构建高性能,可扩展的Web应用的完美解决方案,可以内存存储亦可持久化存储.因为要使用跨进程,跨服务级别的数据缓存,在对比多个方案后,决定使用 ...
- 【SoDiaoEditor电子病历编辑器】阶段性更新--新增复选框、日期控件、表格排版支持等
转眼距离上一次v2正式发布已经过去一个半月了.github期间不定期push了二十几次,同时感谢分布在广州.福建.上海.北京的一众小伙伴,正是你们给出的建议,才让SoDiaoEditor不断完善. 我 ...