Can I fly high in the Sky?

Never say never.

导航

这里,将日志管理基类命名为LogManagerBase(抽象类),具体的不同类型的日志可以通过继承完成。该基类可将日志以每个2M的方式存储起来,并可以读取当前正在使用的日志的所有内容。

要实现该基类,首先要了解以下几个IO类:

命名空间:System.IO

相关类:Directory,DirectoryInfo,File,FileInfo,FileStream,StreamReader,StreamWriter

具体实现代码如下:

 1 public abstract class LogManagerBase
 2     {
 3         public LogManagerBase(string _type)
 4         {
 5             this.logType = _type;
 6         }
 7         private  string logPath = string.Empty;
 8         /// <summary>
 9         /// Local Folder to save logs,default is application(.exe) folder
10         /// </summary>
11         public string LogPath
12         {
13             get
14             {
15                 if (logPath == string.Empty)
16                 {
17                     logPath = AppDomain.CurrentDomain.BaseDirectory+string.Format(@"Log\{0}\", LogType);
18                     if (!Directory.Exists(logPath))
19                         Directory.CreateDirectory(logPath);
20                 }
21                 return logPath;
22             }
23             set { logPath = value; }
24         }
25 
26         /// <summary>
27         /// a URL to store log temporarily
28         /// </summary>
29         public string TempURL
30         {
31             get { return LogPath + string.Format("temp_{0}.log",LogType); }
32         }
33 
34         /// <summary>
35         /// type of Log
36         /// </summary>
37         private string logType;
38         public string LogType
39         {
40             get { return logType; }
41         }
42 
43         /// <summary>
44         /// write record to current temp log
45         /// </summary>
46         /// <param name="_record"></param>
47         public void WriteLog(string _record)
48         {
49             FileInfo fileInfo=new FileInfo(TempURL);
50 
51             if (fileInfo.Exists)
52             {
53                 if (fileInfo.Length > 1024 * 1024 * 2)
54                 {
55                     string formalURL =string.Format(@"{0}{1}{2}.log", LogPath , DateTime.Now.ToString("yyyyMMddHHmmss") ,LogType);
56                     File.Move(TempURL, formalURL);
57                 }
58             }
59             else
60             {
61                 using (FileStream fs = File.Create(TempURL))
62                 {
63                     StreamWriter sw = new StreamWriter(fs);
64                     sw.WriteLine(string.Format("{0} {1}", LogType, DateTime.Now.ToString("yyyyMMddHHmmss")));
65                     sw.WriteLine("--------------------------------------------------------------------------");
66                     sw.Flush();
67                 }
68             }
69             using (StreamWriter sw = File.AppendText(TempURL))
70             {
71                 sw.WriteLine(_record);
72                 sw.Flush();
73             }
74         }
75         /// <summary>
76         /// Read current temp log
77         /// </summary>
78         /// <returns></returns>
79         public string ReadLog()
80         {
81             FileInfo fileInfo = new FileInfo(TempURL);
82             if (!fileInfo.Exists) return null;
83             StreamReader sr = new StreamReader(TempURL);
84             string strLog = sr.ReadToEnd();
85             sr.Close();
86             //string strLog = File.ReadAllText(TempURL);
87             return strLog;
88         }
89 
90     }

 

最后,讲下在敲代码时碰到的几个小问题:

1)如果当前不存在要保存的文件夹,请首先使用Directory进行创建,然后再把文件存在当前目录;(使用DirectoryInfo进行查看路径是否存在)

2)ReadLog()返回字符串时,请注意字符串中是否含有’\0‘,如果有的话,哪怕返回的是所有数据行,但string类型也只会显示到第一个‘\0’之前的信息;

3)日志文件比较大的情况下,请使用StreamReader类读写(参考msdn文档);

4)使用StreamWriter时,请注意最后StreamWriter.Flush()这一步。