你的位置:首页 > ASP.net教程

[ASP.net教程]【.net】创建属于自己的log组件——改进版


在上一篇随笔中,建立了一个自己的Log简单日志记录类  

可是在众多园友的提点下,对于线程,阻塞,资源竞争等都没有仔细的去了解

在这版的改进中,我们新加了线程操作,线程等待,以及多层的错误捕获。【不知道有什么用可是潜意识叫我加上】

这些改进用于——作为一个本分的Log,绝对不影响主线程的流程不阻塞,同时能应对多个日志写入的要求,且避免资源的竞争。充分利用cpu的优势,让Log稳定的记录。

 

改进之后的代码

【感谢@Leandro的建议,再次修改之后的代码】

using System;using System.ComponentModel;using System.IO;using System.Threading;using System.Threading.Tasks;namespace CustomerLog{  /// <summary>  /// 保存日志  /// </summary>  public class Loghelper  {    private static Mutex _mutex;    static Loghelper()    {      _mutex = new Mutex();    }    #region 公开线程写入日志    /// <summary>    /// 消息日志记录    /// </summary>    /// <param name="message">消息</param>    public void Log(string message)    {      try      {        new Task(() => Writelog(message)).Start();      }      catch      {        // ignored      }    }    /// <summary>    /// 错误日志记录    /// </summary>    /// <param name="ex">错误</param>    public void Log(Exception ex)    {      try      {        new Task(() => WriteBuglog(ex)).Start();      }      catch      {        // ignored      }    }    #endregion    #region 日志分类    /// <summary>    /// 保存普通日志    /// </summary>    /// <param name="message"></param>    private bool Writelog(string message)    {      string logContent = string.Format("[{0}] =>{1}", DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"), message);      return SetFile(@"Log.txt", logContent);    }    /// <summary>    /// 保存错误信息日志    /// </summary>    /// <param name="ex"></param>    private bool WriteBuglog(Exception ex)    {      var logContent = string.Format("[{0}]错误发生在:{1},\r\n 内容:{2}",        DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"), ex.Source, ex.Message);      logContent += string.Format("\r\n 跟踪:{0}", ex.StackTrace);      return SetFile(@"BugLog.txt", logContent);    }    #endregion    #region 通用操作    /// <summary>    /// 标准化写入过程,继承之后可自定义写入内容    /// 默认保存在debug目录的Log目录下    /// </summary>    /// <param name="filename">文件名</param>    /// <param name="logContent">写入内容</param>    private static bool SetFile(string filename, string logContent)    {      _mutex.WaitOne();      try      {        Isexist(); // 判断Log目录是否存在        string errLogFilePath = Environment.CurrentDirectory + @"\Log\" + filename.Trim();// 获取当前目录地址        StreamWriter sw;        if (!File.Exists(errLogFilePath))        {          FileStream fs1 = new FileStream(errLogFilePath, FileMode.Create, FileAccess.Write);          sw = new StreamWriter(fs1);        }        else        {          sw = new StreamWriter(errLogFilePath, true);        }        sw.WriteLine(logContent);        sw.Flush();        sw.Close();        return true;      }      catch      {        // 忽略错误        return false;      }      finally      {        _mutex.ReleaseMutex();      }    }    // 判断是否存在日志文件    private static void Isexist()    {      string path = Environment.CurrentDirectory + @"\Log\";      if (!File.Exists(path))      {        Directory.CreateDirectory(path);      }    }    #endregion  }}

 

在新的代码中取消了静态的方法,在类初始化的时候实例一个控制线程的控制器。

 

OK修改过后的就这个了。有疑问的希望广大园友能提出来,大家共同学习改进。