Log.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. //************************************************************************
  2. // https://github.com/yuzhengyang
  3. // author: yuzhengyang
  4. // date: 2017.3.29 - 2017.7.6
  5. // desc: 日志功能
  6. // Copyright (c) yuzhengyang. All rights reserved.
  7. //************************************************************************
  8. //R.Log.IsWriteFile = true;
  9. //R.Log.LogLevel = LogLevel.Warning | LogLevel.Debug;
  10. //Log.AllocConsole();
  11. //R.Log.v("this is v 啰嗦");
  12. //R.Log.d("this is d 调试");
  13. //R.Log.i("this is i 重要");
  14. //R.Log.w("this is w 警告");
  15. //R.Log.e("this is e 错误");
  16. using System;
  17. using System.Runtime.InteropServices;
  18. using Y.Utils.IOUtils.PathUtils;
  19. using Y.Utils.IOUtils.TxtUtils;
  20. namespace Y.Utils.IOUtils.LogUtils
  21. {
  22. /// <summary>
  23. /// Log 输出工具
  24. ///
  25. /// 说明:
  26. /// 1、Log.AllocConsole();开启控制台
  27. /// 2、Log.FreeConsole();关闭控制台
  28. /// 3、Log.i("information");输出消息
  29. /// </summary>
  30. public class Log
  31. {
  32. //输出的 Log 格式
  33. const string LOG_FORMAT = "{0} {1} {2}";
  34. const string TIME_FORMAT = "HH:mm:ss.fff";
  35. const string LOG_PATH = "Log";
  36. private object LogFileLock = new object();//写日志文件锁
  37. private bool IsWriteFile = false;//是否写日志文件
  38. public string LogPath = LOG_PATH;
  39. public LogLevel LogLevel = LogLevel.All;//日志输出等级
  40. public Log()
  41. { }
  42. public Log(bool isWrite, string logPath = LOG_PATH, LogLevel level = LogLevel.All)
  43. {
  44. if (isWrite && !string.IsNullOrWhiteSpace(logPath))
  45. {
  46. LogPath = logPath.Trim();
  47. IsWriteFile = true;
  48. LogLevel = level;
  49. }
  50. }
  51. public bool SetWriteFile(bool isWrite, string logPath)
  52. {
  53. if (isWrite && !string.IsNullOrWhiteSpace(logPath))
  54. {
  55. LogPath = logPath.Trim();
  56. IsWriteFile = true;
  57. return true;
  58. }
  59. IsWriteFile = false;
  60. return false;
  61. }
  62. #region Console 开启/关闭 API
  63. [DllImport("kernel32.dll")]
  64. public static extern Boolean AllocConsole();
  65. [DllImport("kernel32.dll")]
  66. public static extern Boolean FreeConsole();
  67. #endregion
  68. /// <summary>
  69. /// 获取输出颜色
  70. /// </summary>
  71. /// <param name="type">输出类型</param>
  72. /// <returns></returns>
  73. private ConsoleColor GetColor(LogType type)
  74. {
  75. switch (type)
  76. {
  77. case LogType.v: return ConsoleColor.Gray;
  78. case LogType.d: return ConsoleColor.Blue;
  79. case LogType.i: return ConsoleColor.Green;
  80. case LogType.w: return ConsoleColor.Yellow;
  81. case LogType.e: return ConsoleColor.Red;
  82. default: return ConsoleColor.Gray;
  83. }
  84. }
  85. /// <summary>
  86. /// 写出到控制台
  87. /// </summary>
  88. /// <param name="type">类型</param>
  89. /// <param name="tag">标记</param>
  90. /// <param name="message">消息</param>
  91. private void Write(LogType type, string message)
  92. {
  93. Console.ForegroundColor = GetColor(type);
  94. Console.WriteLine(LOG_FORMAT, DateTime.Now.ToString(TIME_FORMAT), type.ToString(), message);
  95. if (IsWriteFile) WriteFile(type, message);
  96. }
  97. private void WriteFile(LogType type, string message)
  98. {
  99. if (IsWriteFile)
  100. {
  101. lock (LogFileLock)
  102. {
  103. //设置日志目录
  104. string logPath = AppDomain.CurrentDomain.BaseDirectory + LogPath;
  105. string file = string.Format(@"{0}\{1}.txt", logPath, DateTime.Now.ToString("yyyy-MM-dd"));
  106. //创建日志目录
  107. DirTool.Create(logPath);
  108. //写出日志
  109. TxtTool.Append(file, string.Format(LOG_FORMAT, DateTime.Now.ToString(TIME_FORMAT), type.ToString(), message));
  110. }
  111. }
  112. }
  113. #region 分类详细输出
  114. /// <summary>
  115. /// 输出 verbose (啰嗦信息)
  116. /// </summary>
  117. /// <param name="message">消息</param>
  118. /// <param name="tag">可选:标记</param>
  119. public void v<T>(T msg)
  120. {
  121. if ((LogLevel & LogLevel.Verbose) == LogLevel.Verbose)
  122. Write(LogType.v, msg.ToString());
  123. }
  124. /// <summary>
  125. /// 输出 Debug (调试信息)
  126. /// </summary>
  127. /// <param name="message">消息</param>
  128. /// <param name="tag">可选:标记</param>
  129. public void d<T>(T msg)
  130. {
  131. if ((LogLevel & LogLevel.Debug) == LogLevel.Debug)
  132. Write(LogType.d, msg.ToString());
  133. }
  134. /// <summary>
  135. /// 输出 Information (重要信息)
  136. /// </summary>
  137. /// <param name="message">消息</param>
  138. /// <param name="tag">可选:标记</param>
  139. public void i<T>(T msg)
  140. {
  141. if ((LogLevel & LogLevel.Information) == LogLevel.Information)
  142. Write(LogType.i, msg.ToString());
  143. }
  144. /// <summary>
  145. /// 输出 Warning (警告信息)
  146. /// </summary>
  147. /// <param name="message">消息</param>
  148. /// <param name="tag">可选:标记</param>
  149. public void w<T>(T msg)
  150. {
  151. if ((LogLevel & LogLevel.Warning) == LogLevel.Warning)
  152. Write(LogType.w, msg.ToString());
  153. }
  154. /// <summary>
  155. /// 输出 Error (错误信息)
  156. /// </summary>
  157. /// <param name="message">消息</param>
  158. /// <param name="tag">可选:标记</param>
  159. public void e<T>(T msg)
  160. {
  161. if ((LogLevel & LogLevel.Error) == LogLevel.Error)
  162. Write(LogType.e, msg.ToString());
  163. }
  164. #endregion
  165. }
  166. }