在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1 using System; 2 using System.Diagnostics; 3 using System.IO; 4 using System.Text; 5 using System.Threading; 6 using System.Collections.Generic; 7 8 namespace Tools.Log 9 { 10 /// <summary> 11 /// 多线程安全Log记录工具20180314 12 /// </summary> 13 public class LogHelper 14 { 15 //为了使用DBGView进行在线调试: 16 //System.Diagnostics.Debug.WriteLine("Debug模式可见") 17 //System.Diagnostics.Trace.WriteLine("Debug、Release都可见"); 18 19 private static Thread WriteThread; 20 private static readonly Queue<string> MsgQueue; 21 22 private static readonly string FilePath; 23 24 private static Boolean autoResetEventFlag = false; 25 private static AutoResetEvent aEvent = new AutoResetEvent(false); 26 private static bool flag = true; 27 public static bool LogFlag = true; 28 29 static LogHelper() 30 { 31 FilePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "App_Log\\"; 32 WriteThread = new Thread(WriteMsg); 33 MsgQueue = new Queue<string>(); 34 WriteThread.Start(); 35 } 36 37 public static void LogInfo(string msg) 38 { 39 Monitor.Enter(MsgQueue); 40 MsgQueue.Enqueue(string.Format("{0} {1} {2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss"), "Info", msg)); 41 Monitor.Exit(MsgQueue); 42 if (autoResetEventFlag) { 43 aEvent.Set(); 44 } 45 } 46 public static void LogError(string msg) 47 { 48 Monitor.Enter(MsgQueue); 49 MsgQueue.Enqueue(string.Format("{0} {1} {2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss"), "Error", msg)); 50 Monitor.Exit(MsgQueue); 51 if (autoResetEventFlag) 52 { 53 aEvent.Set(); 54 } 55 } 56 public static void LogWarn(string msg) 57 { 58 Monitor.Enter(MsgQueue); 59 MsgQueue.Enqueue(string.Format("{0} {1} {2}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:sss"), "Warn", msg)); 60 Monitor.Exit(MsgQueue); 61 if (autoResetEventFlag) 62 { 63 aEvent.Set(); 64 } 65 } 66 67 /// <summary> 68 /// ExitThread是退出日志记录线程的方法,一旦退出,无法开启,一般在程序关闭时执行 69 /// </summary> 70 public static void ExitThread() { 71 flag = false; 72 aEvent.Set();//恢复线程执行 73 } 74 private static void WriteMsg() 75 { 76 while (flag) 77 { 78 //进行记录 79 if (LogFlag) 80 { 81 autoResetEventFlag = false; 82 if (!Directory.Exists(FilePath)) 83 { 84 Directory.CreateDirectory(FilePath); 85 } 86 string fileName = FilePath + DateTime.Now.ToString("yyyy-MM-dd") + "-Dic.log"; 87 var logStreamWriter = new StreamWriter(fileName, true); 88 while (MsgQueue.Count > 0) 89 { 90 Monitor.Enter(MsgQueue); 91 string msg = MsgQueue.Dequeue(); 92 Monitor.Exit(MsgQueue); 93 logStreamWriter.WriteLine(msg); 94 if (GetFileSize(fileName) > 1024 * 5) 95 { 96 logStreamWriter.Flush(); 97 logStreamWriter.Close(); 98 CopyToBak(fileName); 99 logStreamWriter = new StreamWriter(fileName, false); 100 logStreamWriter.Write(""); 101 logStreamWriter.Flush(); 102 logStreamWriter.Close(); 103 logStreamWriter = new StreamWriter(fileName, true); 104 } 105 //下面用于DbgView.exe工具进行在线调试 106 System.Diagnostics.Debug.WriteLine("BS_Debug:"+msg); 107 System.Diagnostics.Trace.WriteLine("BS_Release:" + msg); 108 } 109 logStreamWriter.Flush(); 110 logStreamWriter.Close(); 111 autoResetEventFlag = true; 112 aEvent.WaitOne(); 113 } 114 else { 115 autoResetEventFlag = true; 116 aEvent.WaitOne(); 117 } 118 } 119 } 120 private static long GetFileSize(string fileName) 121 { 122 long strRe = 0; 123 if (File.Exists(fileName)) 124 { 125 var myFs=new FileInfo(fileName); 126 strRe = myFs.Length / 1024; 127 //Console.WriteLine(strRe); 128 } 129 return strRe; 130 } 131 private static void CopyToBak(string sFileName) 132 { 133 int fileCount = 0; 134 string sBakName = ""; 135 do 136 { 137 fileCount++; 138 sBakName = sFileName + "." + fileCount + ".BAK"; 139 } 140 while (File.Exists(sBakName)); 141 File.Copy(sFileName, sBakName); 142 } 143 } 144 }
该类由BS风华改编自网上一个类。实现了多线程下面安全记录日志的功能: 使用方法: 1 Tools.Log.LogHelper.LogFlag = true; //开启记录 2 Tools.Log.LogHelper.LogInfo("==========日志记录内容 Info===="); 3 Tools.Log.LogHelper.LogWarn("==========日志记录内容 Warn===="); 4 Tools.Log.LogHelper.LogError("==========日志记录内容 Error===="); 5 Tools.Log.LogHelper.LogFlag = false;//停止记录 如果有更好的方式,欢迎留言 |
请发表评论