一个可创建读取日志的管理类(可固定创建2M大小的日志文件)
这里,将日志管理基类命名为LogManagerBase(抽象类),具体的不同类型的日志可以通过继承完成。该基类可将日志以每个2M的方式存储起来,并可以读取当前正在使用的日志的所有内容。
要实现该基类,首先要了解以下几个IO类:
命名空间:System.IO
相关类:Directory,DirectoryInfo,File,FileInfo,FileStream,StreamReader,StreamWriter
具体实现代码如下:
public abstract class LogManagerBase
{
public LogManagerBase(string _type)
{
this.logType = _type;
}
private string logPath = string.Empty;
/// <summary>
/// Local Folder to save logs,default is application(.exe) folder
/// </summary>
public string LogPath
{
get
{
if (logPath == string.Empty)
{
logPath = AppDomain.CurrentDomain.BaseDirectory+string.Format(@"Log\{0}\", LogType);
if (!Directory.Exists(logPath))
Directory.CreateDirectory(logPath);
}
return logPath;
}
set { logPath = value; }
} /// <summary>
/// a URL to store log temporarily
/// </summary>
public string TempURL
{
get { return LogPath + string.Format("temp_{0}.log",LogType); }
} /// <summary>
/// type of Log
/// </summary>
private string logType;
public string LogType
{
get { return logType; }
} /// <summary>
/// write record to current temp log
/// </summary>
/// <param name="_record"></param>
public void WriteLog(string _record)
{
FileInfo fileInfo=new FileInfo(TempURL); if (fileInfo.Exists)
{
if (fileInfo.Length > * * )
{
string formalURL =string.Format(@"{0}{1}{2}.log", LogPath , DateTime.Now.ToString("yyyyMMddHHmmss") ,LogType);
File.Move(TempURL, formalURL);
}
}
else
{
using (FileStream fs = File.Create(TempURL))
{
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(string.Format("{0} {1}", LogType, DateTime.Now.ToString("yyyyMMddHHmmss")));
sw.WriteLine("--------------------------------------------------------------------------");
sw.Flush();
}
}
using (StreamWriter sw = File.AppendText(TempURL))
{
sw.WriteLine(_record);
sw.Flush();
}
}
/// <summary>
/// Read current temp log
/// </summary>
/// <returns></returns>
public string ReadLog()
{
FileInfo fileInfo = new FileInfo(TempURL);
if (!fileInfo.Exists) return null;
StreamReader sr = new StreamReader(TempURL);
string strLog = sr.ReadToEnd();
sr.Close();
//string strLog = File.ReadAllText(TempURL);
return strLog;
} }
最后,讲下在敲代码时碰到的几个小问题:
1)如果当前不存在要保存的文件夹,请首先使用Directory进行创建,然后再把文件存在当前目录;(使用DirectoryInfo进行查看路径是否存在)
2)ReadLog()返回字符串时,请注意字符串中是否含有’\0‘,如果有的话,哪怕返回的是所有数据行,但string类型也只会显示到第一个‘\0’之前的信息;
3)日志文件比较大的情况下,请使用StreamReader类读写(参考msdn文档);
4)使用StreamWriter时,请注意最后StreamWriter.Flush()这一步。
一个可创建读取日志的管理类(可固定创建2M大小的日志文件)的更多相关文章
- 分享一个14年写的用户管理类-swift版
AccountManager类 14年设计,从swift 0.9开始,迭代到现在swift4.0版本,总体几乎没什么改动,简单稳定. 其实现的思路主要还是借助之前net反射的经验,实现了自动保存用户信 ...
- DownloadManager 下载管理类
演示 简介 从Android 2.3开始新增了一个下载管理类,在SDK的文档中我们查找android.app.DownloadManager可以看到.下载管理类可以长期处理多个HTTP下载任务,客户端 ...
- [转]3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】
本文转自:http://www.cnblogs.com/jirigala/archive/2010/10/07/1845275.html 2010-10-07 21:39 by 通用C#系统架构, 5 ...
- Android 性能优化(16)线程优化:Creating a Manager for Multiple Threads 如何创建一个线程池管理类
Creating a Manager for Multiple Threads 1.You should also read Processes and Threads The previous le ...
- Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!
Go/Python/Erlang编程语言对比分析及示例 本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...
- ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(7)之扩展基类和区域创建以及文本编辑配置
一.扩展基类和区域创建 (1)在应用之前,我们先在表现层创建一个公共的系统扩展文件来(SystemExtension)存放我们需要延伸和扩展的方法类. 在常规的项目系统操作中,我们都需要用到增删查改的 ...
- 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil
封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...
- 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,nloglogutil
封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...
- Cookie操作类、 包括创建、读取、修改、获取、销毁cookie
Cookie操作类. 包括创建.读取.修改.获取.销毁cookie import java.util.Hashtable; import java.util.Iterator; import java ...
随机推荐
- 【英语】Bingo口语笔记(68) - come系列
- Android RecyclerView使用详解(一)
一.前言 RecyclerView是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视 ...
- Nodejs学习之一 下载安装与部署nodejs
1,下载nodejs 访问nodejs官网 www.nodejs.org/download/ 下载与机器相匹配的版本 2,安装nodejs 下载下来的msi包一直点击下一步即可 3,部署环 ...
- 使用模板时 error LNK2019: 无法解析的外部符号
类模板是c++编译器指令 说明了如何生成类和成员函数 除非编译器实现了新的关键字export关键字 否则将模板成员函数放置在一个独立的实现文件中 将无法运行 因为模板不是函数 他们不能单独编译 模板必 ...
- XSS 前端防火墙(4):天衣无缝的防护
例如,我们的属性钩子只考虑了 setAttribute,却忽视还有类似的 setAttributeNode.尽管从来不用这方法,但并不意味人家不能使用. 例如,创建元素通常都是 createEleme ...
- JavaScript基础知识整理(1)数组
第一:创建. 1,var arr= new Array(); //数组为空.长度为0. arr[0]="apple"; arr[1]="orange"; arr ...
- Srum框架
Srum包括三个角色.四个会议.及三个产出物,如下图所示:
- 《Java数据结构与算法》笔记-CH5-链表-2单链表,增加根据关键字查找和删除
/** * Link节点 有数据项和next指向下一个Link引用 */ class Link { private int iData;// 数据 private double dData;// 数据 ...
- [cocos2d-js]按钮整合成大图后打APK后不显示
网页版本都能正常显示碎图和整合成大图的 手机版本不正常 var btnKick = cc.MenuItemImage.create( "#btn_kick.png", " ...
- sql的join用法
SQL join 用于把来自两个或多个表的行结合起来,sql join主要包括inner join. left join .right join .full outer join. 先介绍一下表里面的 ...