从网上找了些资源,借鉴整理之后,自己随便写了一个。
public class LogHelper { #region 构造函数、析构函数、单一实体 private LogHelper() { _threadWriteLog = new Thread(new ThreadStart(WriteLog)); _threadWriteLog.Start(); } ~LogHelper() { if (_threadWriteLog != null) { _threadWriteLog.Abort(); _threadWriteLog = null; } } private static LogHelper logHelper; private static readonly object sysRoot = new object(); /// <summary> /// 日志类的单一实体 /// </summary> public static LogHelper LogHelperSingle { get { if (logHelper == null) { lock (sysRoot) { if (logHelper == null) { logHelper = new LogHelper(); } } } return logHelper; } } #endregion #region 属性 private string _path = string.Empty; /// <summary> /// 日志路径 /// </summary> public string LogPath { set { this._path = value; } get { if (string.IsNullOrEmpty(this._path)) { this._path = string.Format("{0}\Log", Application.StartupPath); } return this._path; } } private string _logName; /// <summary> /// 日志名称 /// </summary> public string LogName { set { this._logName = value; } get { if (string.IsNullOrEmpty(this._logName)) { DateTime t = DateTime.Now; this._logName = string.Format("{0}{1}{2}.txt", t.Year, t.Month, t.Day); } return this._logName; } } /// <summary> /// 日志信息 /// </summary> private List<string[]> _logInfo = new List<string[]>(); /// <summary> /// 写日志线程 /// </summary> Thread _threadWriteLog = null; #endregion #region 对外方法 /// <summary> /// 写日志 /// </summary> /// <param name="exc">错误</param> /// <param name="fileName">try...catch 所在页面</param> public void WriteErrorLog(Exception exc, string fileName) { string[] log = GetErrorLogInfo(exc, fileName); this._logInfo.Add(log); } /// <summary> /// 记录常规日志 /// </summary> /// <param name="message">日志信息</param> public void WriteRoutineLog(string message) { string[] log = GetRoutineLog(message); this._logInfo.Add(log); } #endregion #region 对内方法 /// <summary> /// 记录日志 /// </summary> private void WriteLog() { while (true) { Thread.Sleep(200); if (_logInfo.Count > 0) { string[] info = _logInfo[0]; WriteLog(info, this.LogPath, this.LogName); this._logInfo.RemoveAt(0); } } } /// <summary> /// 得到异常信息的字符串数组 /// </summary> /// <param name="exc">异常对象</param> /// <returns>字符串数组</returns> private string[] GetErrorLogInfo(Exception exc, string fileName) { string[] info = new string[7]; info[0] = string.Format("记录时间:{0}", DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")); info[1] = string.Format("异常实例:{0}", exc.InnerException != null ? exc.InnerException.ToString() : string.Empty); info[2] = string.Format("try..catch所在页面:{0}", fileName); info[3] = string.Format("引发异常的方法:{0}", exc.TargetSite.ToString()); info[4] = string.Format("导致错误的应用程序或对象的名称:{0}", exc.Source); info[5] = string.Format("错误信息:{0}", exc.Message); info[6] = string.Empty; return info; } /// <summary> /// 得到常规日志记录 /// </summary> /// <param name="message">日志信息</param> private string[] GetRoutineLog(string message) { string[] log = new string[3]; log[0] = string.Format("记录时间:{0}", DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")); log[1] = string.Format("记录信息:{0}", message); log[2] = string.Empty; return log; } /// <summary> /// 记录日志 /// </summary> /// <param name="log">日志信息</param> /// <param name="path">日志路径</param> /// <param name="logName">日志名称</param> private void WriteLog(string[] log, string path, string logName) { string fullName = string.Format(@"{0}{1}", path.TrimEnd('\'), logName); if (!File.Exists(fullName)) { if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } using (FileStream fs = new FileStream(fullName, FileMode.Create)) { using (StreamWriter sw = new StreamWriter(fs)) { for (int i = 0; i < log.Length; i++) { sw.WriteLine(log[i]); } } } } else { using (FileStream fs = new FileStream(fullName, FileMode.Append)) { using (StreamWriter sw = new StreamWriter(fs)) { for (int i = 0; i < log.Length; i++) { sw.WriteLine(log[i]); } } } } } #endregion }