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哦. 下 ...
随机推荐
- Java数据结构和算法
首先,本人自学java,但是只学习了java的基础知识,所以想接下来学习一下数据结构和算法,但是找了很多教材,大部分写的好的都是用c语言实现的,虽然知道数据结构和算法,跟什么语言实现的没有关系,但是我 ...
- 消息队列NetMQ 原理分析3-命令产生/处理和回收线程
消息队列NetMQ 原理分析3-命令产生/处理和回收线程 前言 介绍 目的 命令 命令结构 命令产生 命令处理 创建Socket(SocketBase) 创建连接 创建绑定 回收线程 释放Socket ...
- 杜教筛 && bzoj3944 Sum
Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用空格分隔的数ans1,ans ...
- FrameBuffer系列 之 显示图片
摘自:http://blog.csdn.net/luxiaoxun/article/details/7622988 #include <unistd.h> #include < ...
- [内存管理]连续内存分配器(CMA)概述
作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. 原文地址:http://lwn.net/Articles/396657/ 1 ...
- hibernate 插入数据时让数据库默认值生效
用hibernate做数据库插入操作时,在数据库端已经设置了对应列的默认值,但插入的数据一直为null.查找资料发现,原来是hibernate的配置项在作怪. Hibernate允许我们在映射文件里控 ...
- 【2017-05-02】winform弹出警告框是否进行增删改操作、记事本制作、对话框控件和输出输入流
一.winform弹出警告框是否进行增删改操作 第一个参数是弹出窗体显示的内容,第二个参数是标题,第三个参数是该弹窗包含确定和取消按钮. 返回的是一个枚举类接收一下. 再进行判断,如果点的是确定按钮, ...
- Net分布式系统之五:微服务架构
因工作较忙,抽时间将框架遇到的问题和框架升级设计进行记录. 一.背景&问题 之前框架是一个基于SOA思想设计的分布式框架.各应用通过服务方式提供使用,服务之间通信是RPC方式调用,具体实现基于 ...
- web前端技术框架选型参考
一.出发点 随着Web技术的不断发展,前端架构框架.UI框架.构建工具.CSS预处理等层出不穷,各有千秋.太多的框架在形成初期,都曾在web领域 掀起过一场技术浪潮,可有些却仅仅是昙花一现,随着他们用 ...
- luogu 1521-求逆序对
题意: 逆序对指在一个序列中ai>aj && i < j,也就是一前一后两个数,当大的在前面的时候即算一对. 题目求在一个由1-n组成的序列中逆序对为k的序列的个数. 出题 ...