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哦. 下 ...
随机推荐
- javaWeb项目(SSH框架+AJAX+百度地图API+Oracle数据库+MyEclipse+Tomcat)之二 基础Hibernate框架搭建篇
我们在搭建完Struts框架之后,从前台想后端传送数据就显得非常简单了.Struts的功能不仅仅是一个拦截器,这只是它的核心功能,此外我们也可以自定义拦截器,和通过注解的方式来更加的简化代码. 接下来 ...
- 使用SSH框架查出的实体集合用AJAX形式刷新到页面JOSONArray报异常
所报异常:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException 问题根源:数据库中查出的日期是java.sql. ...
- LRU Cache java实现
要求: get(key):如果key在cache中,则返回对应的value值,否则返回null set(key,value):如果key不在cache中,则将该(key,value)插入cache中( ...
- [CTSC2008] 网络管理
题目描述 Description M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构 ...
- WPF 杂谈——资源文件
编写一个应用难免要用到WPF本身的控件.不管是WinForm还是网页都会有自己的控件.只是在写法和用法上有所不同而以.而控件命名却离不开那几个单词.所以不用担心判断不出来哪个是按扭,哪个是文本框.举个 ...
- ThinkPHP框架的增删改
使用TP框架主要是比较简单一些,之前我们写增删改,代码量相对来说还是比较多的,这里利用tp框架写起来是非常简单的,大大的减少了代码量 这里我是以数据库的nation表为例的,nation表 ...
- Elasticsearch 默认配置 IK 及 Java AnalyzeRequestBuilder 使用
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 春夏秋冬失去了你,我怎么过一年四季- 民谣歌词 』 本文提纲 一.什么是 Ela ...
- 一句话告诉你JQuery $(this)到底指的是什么,怎么用
看了网上好多关于jquery $(this)的解释,感觉都说的很模糊. 下面说出我自己的理解. this表示的是当前对象,下面以例子来说明 <!DOCTYPE html> <html ...
- 域名系统DNS和FTP
域名系统概述 域名系统DNS(Domain Name System)是英特网使用的命名系统,用于把便于人们使用机器名字转化为IP地址. 为什么机器在处理IP数据报时要使用IP地址而不使用域名呢?IP地 ...
- 【JAVAWEB学习笔记】10_JDBC连接池&DBUtils
使用连接池改造JDBC的工具类: 1.1.1 需求: 传统JDBC的操作,对连接的对象销毁不是特别好.每次创建和销毁连接都是需要花费时间.可以使用连接池优化的程序. * 在程序开始的 ...