这里,将日志管理基类命名为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大小的日志文件)的更多相关文章

  1. 分享一个14年写的用户管理类-swift版

    AccountManager类 14年设计,从swift 0.9开始,迭代到现在swift4.0版本,总体几乎没什么改动,简单稳定. 其实现的思路主要还是借助之前net反射的经验,实现了自动保存用户信 ...

  2. DownloadManager 下载管理类

    演示 简介 从Android 2.3开始新增了一个下载管理类,在SDK的文档中我们查找android.app.DownloadManager可以看到.下载管理类可以长期处理多个HTTP下载任务,客户端 ...

  3. [转]3天搞定的小型B/S内部管理类软件定制开发项目【软件开发实战10步骤详解】

    本文转自:http://www.cnblogs.com/jirigala/archive/2010/10/07/1845275.html 2010-10-07 21:39 by 通用C#系统架构, 5 ...

  4. 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 ...

  5. Go/Python/Erlang编程语言对比分析及示例 基于RabbitMQ.Client组件实现RabbitMQ可复用的 ConnectionPool(连接池) 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil 分享基于MemoryCache(内存缓存)的缓存工具类,C# B/S 、C/S项目均可以使用!

    Go/Python/Erlang编程语言对比分析及示例   本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性, ...

  6. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(7)之扩展基类和区域创建以及文本编辑配置

    一.扩展基类和区域创建 (1)在应用之前,我们先在表现层创建一个公共的系统扩展文件来(SystemExtension)存放我们需要延伸和扩展的方法类. 在常规的项目系统操作中,我们都需要用到增删查改的 ...

  7. 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil

    封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...

  8. 封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,nloglogutil

    封装一个基于NLog+NLog.Mongo的日志记录工具类LogUtil,代码比较简单,主要是把MongoTarget的配置.FileTarget的配置集成到类中,同时利用缓存依赖来判断是否需要重新创 ...

  9. Cookie操作类、 包括创建、读取、修改、获取、销毁cookie

    Cookie操作类. 包括创建.读取.修改.获取.销毁cookie import java.util.Hashtable; import java.util.Iterator; import java ...

随机推荐

  1. Thrift——初学

    是什么? Thrift是一个跨语言的服务部署框架最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数 ...

  2. $(function(){})和jQuery(function(){})

    $(function(){})和jQuery(function(){})有没有区别,群里的屌丝争吵起来,各自讲着各种理论大道理.但还是有人给出了简而有力的证明: 区分大小写(jQuery) 但jQue ...

  3. 编译及load mydqli.so文件

    (1)cd /usr/local/php-5.2.17/ext/mysqli(2)输入/usr/local/php/bin/phpize 回车(3)./configure --prefix=/usr/ ...

  4. loadrunner11录制不成功解决方法

    问题一:loadrunner11录制时events为0的解决办法  刚安装好的11.0,系统环境是:WIN7+IE11+LR11 1.ie去掉工具—internet选项中->高级—>去掉“ ...

  5. Java核心_内省

    Java核心_内省 查看java的api,发现有一个包java.bean咦,这个包是干什么的呢,原来,它是用来操作JavaBean对象的! 一.内省操作①JavaBean:一种特殊的Java类无参构造 ...

  6. 最小高度的BST

    加深对BST的构建过程及递归思想的理解. /***************************************************** * \file MinimalBST.cpp * ...

  7. ECMAScript 6 入门学习笔记(持续更新)

    1.let命令(作用同var) ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; var b = 1; } ...

  8. Controlling GameObjects Using Components

    [Accessing Components] The most common case is where a script needs access to other Components attac ...

  9. poj 1564 Sum It Up (DFS+ 去重+排序)

    http://poj.org/problem?id=1564 该题运用DFS但是要注意去重,不能输出重复的答案 两种去重方式代码中有标出 第一种if(a[i]!=a[i-1])意思是如果这个数a[i] ...

  10. TdxAlertWindowManager右下角HINT显示控件

    带爱像的右下角HINT显示,自动隐藏 function alterInfo: TdxAlertWindowManager;begin  if not Assigned(Falter) then  be ...