1 using System;
2 using System.IO;
3
4 namespace Common
5 {
6 /// <summary>
7 /// 日志类
8 /// </summary>
9 public static class LogUtil
10 {
11 /// <summary>
12 /// 配置默认路径
13 /// </summary>
14 private static string defaultPath = System.Configuration.ConfigurationManager.AppSettings["logPath"];
15
16 #region Exception异常日志
17
18 /// <summary>
19 /// 写异常日志,存放到默认路径
20 /// </summary>
21 /// <param name="ex">异常类</param>
22 public static void WriteError(Exception ex)
23 {
24 WriteError(ex, defaultPath);
25 }
26
27 /// <summary>
28 /// 写异常日志,存放到指定路径
29 /// </summary>
30 /// <param name="ex">异常类</param>
31 /// <param name="path">日志存放路径</param>
32 public static void WriteError(Exception ex, string path)
33 {
34 string errMsg = CreateErrorMeg(ex);
35 WriteLog(errMsg, path, LogType.Error);
36 }
37
38 #endregion
39
40 #region 普通日志
41
42 /// <summary>
43 /// 写普通日志,存放到默认路径,使用默认日志类型
44 /// </summary>
45 /// <param name="msg">日志内容</param>
46 public static void WriteLog(string msg)
47 {
48 WriteLog(msg, LogType.Info);
49 }
50
51 /// <summary>
52 /// 写普通日志,存放到默认路径,使用指定日志类型
53 /// </summary>
54 /// <param name="msg">日志内容</param>
55 /// <param name="logType">日志类型</param>
56 public static void WriteLog(string msg, LogType logType)
57 {
58 WriteLog(msg, defaultPath, logType);
59 }
60
61 /// <summary>
62 /// 写普通日志,存放到指定路径,使用默认日志类型
63 /// </summary>
64 /// <param name="msg">日志内容</param>
65 /// <param name="path">日志存放路径</param>
66 public static void WriteLog(string msg, string path)
67 {
68 WriteLog(msg, path, LogType.Info);
69 }
70
71 /// <summary>
72 /// 写普通日志,存放到指定路径,使用指定日志类型
73 /// </summary>
74 /// <param name="msg">日志内容</param>
75 /// <param name="path">日志存放路径</param>
76 /// <param name="logType">日志类型</param>
77 public static void WriteLog(string msg, string path, LogType logType)
78 {
79 string fileName = path.Trim('\\')+"\\"+CreateFileName(logType);
80 string logContext = FormatMsg(msg,logType);
81 WriteFile(logContext, fileName);
82 }
83
84 #endregion
85
86 #region 其他辅助方法
87
88 /// <summary>
89 /// 写日志到文件
90 /// </summary>
91 /// <param name="logContext">日志内容</param>
92 /// <param name="fullName">文件名</param>
93 private static void WriteFile(string logContext, string fullName)
94 {
95 FileStream fs = null;
96 StreamWriter sw = null;
97
98 int splitIndex = fullName.LastIndexOf('\\');
99 if (splitIndex == -1) return;
100 string path = fullName.Substring(0, splitIndex);
101
102 if (!Directory.Exists(path)) Directory.CreateDirectory(path);
103
104 try
105 {
106 if (!File.Exists(fullName)) fs = new FileStream(fullName, FileMode.CreateNew);
107 else fs = new FileStream(fullName, FileMode.Append);
108
109 sw = new StreamWriter(fs);
110 sw.WriteLine(logContext);
111 }
112 finally
113 {
114 if (sw != null)
115 {
116 sw.Close();
117 sw.Dispose();
118 }
119 if (fs != null)
120 {
121 fs.Close();
122 fs.Dispose();
123 }
124 }
125 }
126
127 /// <summary>
128 /// 格式化日志,日志是默认类型
129 /// </summary>
130 /// <param name="msg">日志内容</param>
131 /// <returns>格式化后的日志</returns>
132 private static string FormatMsg(string msg)
133 {
134 return FormatMsg(msg, LogType.Info);
135 }
136
137 /// <summary>
138 /// 格式化日志
139 /// </summary>
140 /// <param name="msg">日志内容</param>
141 /// <param name="logType">日志类型</param>
142 /// <returns>格式化后的日志</returns>
143 private static string FormatMsg(string msg, LogType logType)
144 {
145 string result;
146 string header = string.Format("[{0}][{1} {2}] ", logType.ToString(), DateTime.Now.ToShortDateString(),DateTime.Now.ToShortTimeString());
147 result= header + msg;
148 return result;
149 }
150
151 /// <summary>
152 /// 从异常类中获取日志内容
153 /// </summary>
154 /// <param name="ex">异常类</param>
155 /// <returns>日志内容</returns>
156 private static string CreateErrorMeg(Exception ex)
157 {
158 string result = string.Empty;
159 result += ex.Message+"\r\n";
160 result += ex.StackTrace+"\r\n";
161 return result;
162 }
163
164 /// <summary>
165 /// 生成日志文件名
166 /// </summary>
167 /// <param name="logType">日志类型</param>
168 /// <returns>日志文件名</returns>
169 private static string CreateFileName(LogType logType)
170 {
171 string result = DateTime.Now.ToString("yyyy-MM-dd");
172 if (logType != LogType.Info)
173 result = logType.ToString() + result+".log";
174 return result;
175 }
176
177 #endregion
178 }
179
180 /// <summary>
181 /// 日志类型
182 /// </summary>
183 public enum LogType
184 {
185 Error,
186 Info,
187 Option
188 }
189 }