Writelog.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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;
  57. if ( msg.StartsWith("COM") )
  58. _path = FilePath + msg.Substring(0, 10).Trim() + "\\" + DateTime.Now.ToString("yyyy-MM");
  59. else
  60. _path = FilePath + msg.Substring(0, 5).Trim() + "\\" + DateTime.Now.ToString("yyyy-MM");
  61. if (!Directory.Exists(_path))
  62. {
  63. Directory.CreateDirectory(_path);
  64. }
  65. string fileName = _path + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";
  66. msg = msg.Remove(0, 5);
  67. var logStreamWriter = new StreamWriter(fileName, true);
  68. logStreamWriter.WriteLine(msg);
  69. logStreamWriter.Close();
  70. logStreamWriter.Dispose();
  71. Monitor.Exit(FileLock);
  72. if (GetFileSize(fileName) > 1024 * 2)
  73. {
  74. CopyToBak(fileName);
  75. }
  76. }
  77. else
  78. {
  79. System.Threading.Thread.Sleep(5);
  80. }
  81. }
  82. }
  83. private static long GetFileSize(string fileName)
  84. {
  85. long strRe = 0;
  86. if (File.Exists(fileName))
  87. {
  88. Monitor.Enter(FileLock);
  89. var myFs = new FileStream(fileName, FileMode.Open);
  90. strRe = myFs.Length / 1024;
  91. myFs.Close();
  92. myFs.Dispose();
  93. Monitor.Exit(FileLock);
  94. }
  95. return strRe;
  96. }
  97. private static void CopyToBak(string sFileName)
  98. {
  99. int fileCount = 0;
  100. string sBakName = "";
  101. Monitor.Enter(FileLock);
  102. do
  103. {
  104. fileCount++;
  105. sBakName = sFileName + "." + fileCount + ".BAK";
  106. }
  107. while (File.Exists(sBakName));
  108. File.Copy(sFileName, sBakName);
  109. File.Delete(sFileName);
  110. Monitor.Exit(FileLock);
  111. }
  112. }
  113. }