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

[ASP.net教程]C#写文本日志帮助类(支持多线程)改进版(不适用于ASP.NET程序)


由于iis的自动回收机制,不适用于ASP.NET程序

代码:

using System;using System.Collections.Concurrent;using System.Configuration;using System.IO;using System.Text;using System.Threading;using System.Threading.Tasks;namespace CommonDll{  /// <summary>  /// 写日志类  /// </summary>  public class LogUtil  {    #region 字段    public static string path = ConfigurationManager.AppSettings["LogPath"];    public static int fileSize = 10 * 1024 * 1024; //日志分隔文件大小    private static ConcurrentQueue<Tuple<string, DateTime>> queue = new ConcurrentQueue<Tuple<string, DateTime>>();    #endregion    #region 构造函数    static LogUtil()    {      Task.Factory.StartNew(new Action(delegate()      {        StringBuilder log;        string path;        Tuple<string, DateTime> tuple;        string item;        while (true)        {          log = new StringBuilder();          path = CreateLogPath();          while (queue.TryDequeue(out tuple))          {            item = string.Format(@"{0} {1}", tuple.Item2.ToString("yyyy-MM-dd HH:mm:ss.fff"), tuple.Item1);            log.AppendFormat("\r\n{0}", item);          }          if (log.Length > 0) WriteFile(log.ToString(2, log.Length - 2), path);          Thread.Sleep(100);        }      }));    }    #endregion    #region 写文件    /// <summary>    /// 写文件    /// </summary>    public static void WriteFile(string log, string path)    {      try      {        if (!Directory.Exists(Path.GetDirectoryName(path)))        {          Directory.CreateDirectory(Path.GetDirectoryName(path));        }        if (!File.Exists(path))        {          using (FileStream fs = new FileStream(path, FileMode.Create)) { fs.Close(); }        }        using (FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write))        {          using (StreamWriter sw = new StreamWriter(fs))          {            sw.WriteLine(log);            sw.Flush();          }          fs.Close();        }      }      catch { }    }    #endregion    #region 生成日志文件路径    /// <summary>    /// 生成日志文件路径    /// </summary>    public static string CreateLogPath()    {      int index = 0;      string logPath;      bool bl = true;      do      {        index++;        logPath = Path.Combine(path, "Log" + DateTime.Now.ToString("yyyyMMdd") + (index == 1 ? "" : "_" + index.ToString()) + ".txt");        if (File.Exists(logPath))        {          FileInfo fileInfo = new FileInfo(logPath);          if (fileInfo.Length < fileSize)          {            bl = false;          }        }        else        {          bl = false;        }      } while (bl);      return logPath;    }    #endregion    #region 写错误日志    /// <summary>    /// 写错误日志    /// </summary>    public static void LogError(string log)    {      queue.Enqueue(new Tuple<string, DateTime>("[Error] " + log, DateTime.Now));    }    #endregion    #region 写操作日志    /// <summary>    /// 写操作日志    /// </summary>    public static void Log(string log)    {      queue.Enqueue(new Tuple<string, DateTime>("[Info] " + log, DateTime.Now));    }    #endregion  }}

View Code

测试代码:

private void button1_Click(object sender, EventArgs e){  int n = 10000;  DateTime dtStart = DateTime.Now;  for (int i = 1; i <= n; i++)  {    ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object obj)    {      int j = (int)obj;      LogUtil.Log("测试" + j.ToString("00000"));      if (j == n)      {        double sec = DateTime.Now.Subtract(dtStart).TotalSeconds;        MessageBox.Show(n + "条日志完成,耗时" + sec.ToString("0.000") + "秒");      }    }), i);  }}

View Code

效果图: