Writelog.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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", DateTime.Now.ToString("HH:mm:ss fff"), "Info", 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", DateTime.Now.ToString("HH:mm:ss fff"), "Error", 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", DateTime.Now.ToString("HH:mm:ss fff"), "Debug", msg));
  38. Monitor.Exit(MsgQueue);
  39. }
  40. /// <summary>
  41. /// 用于记录函数耗时的日志;
  42. /// </summary>
  43. /// <param name="msg"></param>
  44. public static void WriteTimesdLog(string msg)
  45. {
  46. Monitor.Enter(MsgQueue);
  47. MsgQueue.Enqueue(string.Format("{0}[{1}]{2}\r\n", "Times", DateTime.Now.ToString("HH:mm:ss fff"), msg));
  48. Monitor.Exit(MsgQueue);
  49. }
  50. public static void WriteGetKeyLog(string msg)
  51. {
  52. Monitor.Enter(MsgQueue);
  53. MsgQueue.Enqueue(string.Format("[{0}][{1}]{2}\r\n", DateTime.Now.ToString("HH:mm:ss fff"), "HTTP", msg));
  54. Monitor.Exit(MsgQueue);
  55. }
  56. private static void WriteMsg()
  57. {
  58. while (true)
  59. {
  60. if (MsgQueue.Count > 0)
  61. {
  62. Monitor.Enter(MsgQueue);
  63. string msg = MsgQueue.Dequeue();
  64. Monitor.Exit(MsgQueue);
  65. Monitor.Enter(FileLock);
  66. string _path = FilePath + DateTime.Now.ToString("yyyy-MM");
  67. if (msg.StartsWith("Times"))
  68. {
  69. _path = FilePath + msg.Substring(0, 5).Trim() + "\\" + DateTime.Now.ToString("yyyy-MM");
  70. msg = msg.Remove(0, 5);
  71. }
  72. if (!Directory.Exists(_path))
  73. {
  74. Directory.CreateDirectory(_path);
  75. }
  76. string fileName = _path + "\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".log";
  77. var logStreamWriter = new StreamWriter(fileName, true);
  78. logStreamWriter.WriteLine(msg);
  79. logStreamWriter.Close();
  80. logStreamWriter.Dispose();
  81. Monitor.Exit(FileLock);
  82. // 大于10M时,备份日志文件;
  83. if (GetFileSize(fileName) > 10)
  84. {
  85. fileName = DateTime.Now.ToString("yyyy-MM-dd");
  86. CopyToBak(_path, fileName);
  87. }
  88. }
  89. else
  90. {
  91. System.Threading.Thread.Sleep(5);
  92. }
  93. }
  94. }
  95. private static long GetFileSize(string fileName)
  96. {
  97. long strRe = 0;
  98. if (File.Exists(fileName))
  99. {
  100. Monitor.Enter(FileLock);
  101. var myFs = new FileStream(fileName, FileMode.Open);
  102. strRe = myFs.Length / 1048576;
  103. myFs.Close();
  104. myFs.Dispose();
  105. Monitor.Exit(FileLock);
  106. }
  107. return strRe;
  108. }
  109. private static void CopyToBak(string dir, string sFileName)
  110. {
  111. int fileCount = 0;
  112. string strBackFile = dir + "\\bak";
  113. string strOriginalFile = dir + "\\" + sFileName + ".log";
  114. if (!Directory.Exists(strBackFile))
  115. {
  116. Directory.CreateDirectory(strBackFile);
  117. }
  118. Monitor.Enter(FileLock);
  119. do
  120. {
  121. fileCount++;
  122. strBackFile = dir + "\\bak\\" + sFileName + "-bak." + fileCount + ".log";
  123. }
  124. while (File.Exists(strBackFile));
  125. File.Copy(strOriginalFile, strBackFile);
  126. File.Delete(strOriginalFile);
  127. Monitor.Exit(FileLock);
  128. }
  129. }
  130. }