亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#實(shí)現(xiàn)線程安全的簡易日志記錄方法

 更新時間:2014年08月04日 16:20:31   投稿:shichen2014  
這篇文章主要介紹了C#實(shí)現(xiàn)線程安全的簡易日志記錄方法,比較實(shí)用的功能,需要的朋友可以參考下

一般在實(shí)際項(xiàng)目的開發(fā)中,會要求涉及日志記錄的問題,比較常用的有Log4Net,NLog等幾個,而小項(xiàng)目小工具的話,則無需費(fèi)此大駕。而譬如串口開發(fā)的話,需要記錄串口過來的數(shù)據(jù)等等,這時候就要考慮日志記錄上線程的問題。對此,為了方便后續(xù)使用,封裝了下代碼:

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Threading;

namespace CSharpUtilHelpV2
{
  /// <summary>
  /// 日志類型枚舉
  /// </summary>
  public enum LogType
  {
    /// <summary>
    /// 一般輸出
    /// </summary>
    Trace,
    /// <summary>
    /// 警告
    /// </summary>
    Warning,
    /// <summary>
    /// 錯誤
    /// </summary>
    Error,
    /// <summary>
    /// SQL
    /// </summary>
    SQL
  }
  /// <summary>
  /// 基于.NET 2.0日志工具類
  /// </summary>
  public class LogToolV2
  {
    private static readonly Thread LogTask;
    private static readonly ThreadSafeQueueV2<string> LogColQueue;//自定義線程安全的Queue
    private static readonly object SyncRoot;
    private static readonly string FilePath;
    private static readonly long BackFileSize_MB = 2;//超過2M就開始備份日志文件
    static LogToolV2()
    {
      SyncRoot = new object();
      FilePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "Log\\";
      LogTask = new Thread(WriteLog);
      LogColQueue = new ThreadSafeQueueV2<string>();
      LogTask.Start();
      Debug.WriteLine("Log Start......");
    }
    /// <summary>
    /// 記錄日志
    /// </summary>
    /// <param name="msg">日志內(nèi)容</param>
    public static void Log(string msg)
    {
      string _msg = string.Format("{0} : {2}", DateTime.Now.ToString("HH:mm:ss"), msg);
      LogColQueue.Enqueue(msg);
    }
    /// <summary>
    /// 記錄日志
    /// </summary>
    /// <param name="msg">日志內(nèi)容</param>
    /// <param name="type">日志類型</param>
    public static void Log(string msg, LogType type)
    {
      string _msg = string.Format("{0} {1}: {2}", DateTime.Now.ToString("HH:mm:ss"), type, msg);
      LogColQueue.Enqueue(_msg);
    }
    /// <summary>
    /// 記錄日志
    /// </summary>
    /// <param name="ex">異常</param>
    public static void Log(Exception ex)
    {
      if (ex != null)
      {
        string _newLine = Environment.NewLine;
        StringBuilder _builder = new StringBuilder();
        _builder.AppendFormat("{0}: {1}{2}", DateTime.Now.ToString("HH:mm:ss"), ex.Message, _newLine);
        _builder.AppendFormat("{0}{1}", ex.GetType(), _newLine);
        _builder.AppendFormat("{0}{1}", ex.Source, _newLine);
        _builder.AppendFormat("{0}{1}", ex.TargetSite, _newLine);
        _builder.AppendFormat("{0}{1}", ex.StackTrace, _newLine);
        LogColQueue.Enqueue(_builder.ToString());
      }
    }
    private static void WriteLog()
    {
      while (true)
      {
        if (LogColQueue.Count() > 0)
        {
          string _msg = LogColQueue.Dequeue();
          Monitor.Enter(SyncRoot);
          if (!CreateDirectory()) continue;
          string _path = string.Format("{0}{1}.log", FilePath, DateTime.Now.ToString("yyyyMMdd"));
          Monitor.Exit(SyncRoot);
          lock (SyncRoot)
          {
            if (CreateFile(_path))
              ProcessWriteLog(_path, _msg);//寫入日志到文本
          }
          ProcessBackLog(_path);//日志備份
        }
      }
    }
    private static void ProcessBackLog(string path)
    {
      lock (SyncRoot)
      {
        if (FileToolV2.GetMBSize(path) > BackFileSize_MB)
        {
          FileToolV2.CopyToBak(path);
        }
      }
    }
    private static void ProcessWriteLog(string path, string msg)
    {
      try
      {
        StreamWriter _sw = File.AppendText(path);
        _sw.WriteLine(msg);
        _sw.Flush();
        _sw.Close();
      }
      catch (Exception ex)
      {
        Debug.WriteLine(string.Format("寫入日志失敗,原因:{0}", ex.Message));
      }
    }
    private static bool CreateFile(string path)
    {
      bool _result = true;
      try
      {
        if (!File.Exists(path))
        {
          FileStream _files = File.Create(path);
          _files.Close();
        }
      }
      catch (Exception)
      {
        _result = false;
      }
      return _result;
    }
    private static bool CreateDirectory()
    {
      bool _result = true;
      try
      {
        if (!Directory.Exists(FilePath))
        {
          Directory.CreateDirectory(FilePath);
        }
      }
      catch (Exception)
      {
        _result = false;
      }
      return _result;
    }

  }
}

測試代碼如下:

using CSharpUtilHelpV2;
using System;
using System.Diagnostics;
using System.Threading;

namespace LogUtilHelpV2Test
{
  class Program
  {
    static void Main(string[] args)
    {
      try
      {
        Debug.WriteLine("-------------");
        Action _writeLog = delegate()
        {
          for (int i = 0; i < 10000; i++)
            LogToolV2.Log(Guid.NewGuid().ToString(), LogType.Trace);
        };
        Thread _wireteLogTask1 = new Thread(new ThreadStart(_writeLog));
        _wireteLogTask1.Start();

        Thread _wireteLogTask2 = new Thread(new ThreadStart(_writeLog));
        _wireteLogTask2.Start();

        //throw new Exception("test  aaa bb cc");
      }
      catch (Exception ex)
      {
        LogToolV2.Log(ex);
        Console.WriteLine(ex.Message.Trim());
      }
      finally
      {
        Console.WriteLine("ok");
        Console.ReadLine();
      }
    }
  }
}

代碼運(yùn)行效果如下所示:

感興趣的讀者可以自己測試運(yùn)行一下,希望能對大家起到一點(diǎn)幫助!

相關(guān)文章

最新評論