Writelog.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Threading;
  5. namespace SXLibrary
  6. {
  7. public class Log
  8. {
  9. private static readonly Thread WriteThread;
  10. private static readonly Queue<string> MsgQueue;
  11. private static readonly object FileLock;
  12. private static readonly string FilePath;
  13. static Log()
  14. {
  15. FileLock = new object();
  16. FilePath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "log\\";
  17. WriteThread = new Thread(WriteMsg);
  18. WriteThread.IsBackground = true;
  19. MsgQueue = new Queue<string>();
  20. WriteThread.Start();
  21. }
  22. public static void WriteInfoLog(string msg)
  23. {
  24. Monitor.Enter(MsgQueue);
  25. MsgQueue.Enqueue(string.Format("{0}[{1}]{2}\r\n", " Info", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"), msg));
  26. Monitor.Exit(MsgQueue);
  27. }
  28. public static void WriteErrorLog(string msg)
  29. {
  30. Monitor.Enter(MsgQueue);
  31. MsgQueue.Enqueue(string.Format("{0}[{1}]{2}\r\n", "Error", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"), msg));
  32. Monitor.Exit(MsgQueue);
  33. }
  34. public static void WriteDebugLog(string msg)
  35. {
  36. Monitor.Enter(MsgQueue);
  37. MsgQueue.Enqueue(string.Format("{0}[{1}]{2}\r\n", "Debug", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"), msg));
  38. Monitor.Exit(MsgQueue);
  39. }
  40. public static void WriteGetKeyLog(string msg)
  41. {
  42. Monitor.Enter(MsgQueue);
  43. MsgQueue.Enqueue(string.Format("{0}[{1}]{2}\r\n", "Keyrd", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff"), msg));
  44. Monitor.Exit(MsgQueue);
  45. }
  46. private static void WriteMsg()
  47. {
  48. while (true)
  49. {
  50. if (MsgQueue.Count > 0)
  51. {
  52. Monitor.Enter(MsgQueue);
  53. string msg = MsgQueue.Dequeue();
  54. Monitor.Exit(MsgQueue);
  55. Monitor.Enter(FileLock);
  56. string _path = FilePath + msg.Substring(0, 5).Trim() + "\\" + DateTime.Now.ToString("yyyy-MM");
  57. if (!Directory.Exists(_path))
  58. {
  59. Directory.CreateDirectory(_path);
  60. }
  61. string fileName = _path + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";
  62. msg = msg.Remove(0, 5);
  63. var logStreamWriter = new StreamWriter(fileName, true);
  64. logStreamWriter.WriteLine(msg);
  65. logStreamWriter.Close();
  66. logStreamWriter.Dispose();
  67. Monitor.Exit(FileLock);
  68. if (GetFileSize(fileName) > 1024 * 2)
  69. {
  70. CopyToBak(fileName);
  71. }
  72. }
  73. else
  74. {
  75. System.Threading.Thread.Sleep(5);
  76. }
  77. }
  78. }
  79. private static long GetFileSize(string fileName)
  80. {
  81. long strRe = 0;
  82. if (File.Exists(fileName))
  83. {
  84. Monitor.Enter(FileLock);
  85. var myFs = new FileStream(fileName, FileMode.Open);
  86. strRe = myFs.Length / 1024;
  87. myFs.Close();
  88. myFs.Dispose();
  89. Monitor.Exit(FileLock);
  90. }
  91. return strRe;
  92. }
  93. private static void CopyToBak(string sFileName)
  94. {
  95. int fileCount = 0;
  96. string sBakName = "";
  97. Monitor.Enter(FileLock);
  98. do
  99. {
  100. fileCount++;
  101. sBakName = sFileName + "." + fileCount + ".BAK";
  102. }
  103. while (File.Exists(sBakName));
  104. File.Copy(sFileName, sBakName);
  105. File.Delete(sFileName);
  106. Monitor.Exit(FileLock);
  107. }
  108. }
  109. }