Log.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. //************************************************************************
  2. // author: yuzhengyang
  3. // date: 2017.3.29 - 2018.4.27
  4. // desc: 日志功能
  5. // Copyright (c) yuzhengyang. All rights reserved.
  6. //************************************************************************
  7. //R.Log.IsWriteFile = true;
  8. //R.Log.LogLevel = LogLevel.Warning | LogLevel.Debug;
  9. //Log.AllocConsole();
  10. //R.Log.v("this is v 啰嗦");
  11. //R.Log.d("this is d 调试");
  12. //R.Log.i("this is i 重要");
  13. //R.Log.w("this is w 警告");
  14. //R.Log.e("this is e 错误");
  15. using Azylee.Core.DataUtils.CollectionUtils;
  16. using Azylee.Core.DataUtils.StringUtils;
  17. using Azylee.Core.IOUtils.DirUtils;
  18. using Azylee.Core.IOUtils.FileUtils;
  19. using Azylee.Core.IOUtils.TxtUtils;
  20. using System;
  21. using System.Collections.Concurrent;
  22. using System.Collections.Generic;
  23. using System.IO;
  24. using System.Linq;
  25. using System.Runtime.InteropServices;
  26. using System.Threading;
  27. using System.Threading.Tasks;
  28. namespace Azylee.Core.LogUtils.SimpleLogUtils
  29. {
  30. /// <summary>
  31. /// Log 输出工具
  32. ///
  33. /// 说明:
  34. /// 1、Log.AllocConsole();开启控制台
  35. /// 2、Log.FreeConsole();关闭控制台
  36. /// 3、Log.i("information");输出消息
  37. /// </summary>
  38. public class Log
  39. {
  40. #region 基础属性
  41. //输出的 Log 格式
  42. const string LOG_FORMAT = "{0} {1} {2}";
  43. const string TIME_FORMAT = "HH:mm:ss.fff";
  44. const string LOG_PATH = "azylee.log";
  45. private int CACHE_DAYS = 30;//缓存天数
  46. private object LogFileLock = new object();//写日志文件锁
  47. private bool IsWriteFile = false;//是否写日志文件
  48. private string LogPath = AppDomain.CurrentDomain.BaseDirectory + LOG_PATH;
  49. public LogLevel LogLevel = LogLevel.All;//日志输出等级
  50. #endregion
  51. public Log() { }
  52. public Log(bool isWrite, LogLevel level = LogLevel.All)
  53. {
  54. if (isWrite)
  55. {
  56. IsWriteFile = true;
  57. LogLevel = level;
  58. }
  59. }
  60. public void SetLogPath(string path)
  61. {
  62. if (!string.IsNullOrWhiteSpace(path))
  63. {
  64. LogPath = DirTool.Combine(path, LOG_PATH);
  65. }
  66. }
  67. public void SetCacheDays(int days)
  68. {
  69. if (days >= 0) CACHE_DAYS = days;
  70. }
  71. #region Console 开启/关闭 API
  72. [DllImport("kernel32.dll")]
  73. public static extern Boolean AllocConsole();
  74. [DllImport("kernel32.dll")]
  75. public static extern Boolean FreeConsole();
  76. #endregion
  77. /// <summary>
  78. /// 获取输出颜色
  79. /// </summary>
  80. /// <param name="type">输出类型</param>
  81. /// <returns></returns>
  82. private ConsoleColor GetColor(LogType type)
  83. {
  84. switch (type)
  85. {
  86. case LogType.v: return ConsoleColor.Gray;
  87. case LogType.d: return ConsoleColor.Blue;
  88. case LogType.i: return ConsoleColor.Green;
  89. case LogType.w: return ConsoleColor.Yellow;
  90. case LogType.e: return ConsoleColor.Red;
  91. default: return ConsoleColor.Gray;
  92. }
  93. }
  94. /// <summary>
  95. /// 写出到控制台
  96. /// </summary>
  97. /// <param name="type">类型</param>
  98. /// <param name="message">消息</param>
  99. /// <param name="color">炫彩颜色配置</param>
  100. private void Write(LogType type, string message, ConsoleColor color = ConsoleColor.White)
  101. {
  102. try
  103. {
  104. if (type == LogType.c) Console.ForegroundColor = color;//使用自定义配色
  105. else Console.ForegroundColor = GetColor(type);//使用默认类型配色
  106. Console.WriteLine(LOG_FORMAT, DateTime.Now.ToString(TIME_FORMAT), type.ToString(), message);
  107. }
  108. catch { }
  109. try
  110. {
  111. //取消单独线程输出日志文件(单独线程输出日志必然会有延迟)
  112. //if (IsWriteFile) Queue.Enqueue(new LogModel() { Type = type, Message = message, CreateTime = DateTime.Now });
  113. if (IsWriteFile) WriteFile(new LogModel() { Type = type, Message = message, CreateTime = DateTime.Now });
  114. }
  115. catch { }
  116. }
  117. /// <summary>
  118. /// 写出到日志文件
  119. /// </summary>
  120. /// <param name="log"></param>
  121. private void WriteFile(LogModel log)
  122. {
  123. if (IsWriteFile)
  124. {
  125. lock (LogFileLock)
  126. {
  127. //设置日志目录和日志文件
  128. string filePath = GetFilePath(log.Type);
  129. string file = DirTool.Combine(filePath, DateTime.Now.ToString("yyyy-MM-dd") + ".txt");
  130. //创建日志目录
  131. DirTool.Create(filePath);
  132. //写出日志
  133. TxtTool.Append(
  134. file,
  135. string.Format(LOG_FORMAT,
  136. log.CreateTime.ToString(TIME_FORMAT),
  137. log.Type.ToString(),
  138. StringTool.ReplaceNewLine(log.Message)));
  139. Cleaner(log.Type);
  140. }
  141. }
  142. }
  143. /// <summary>
  144. /// 根据分类分配目录
  145. /// </summary>
  146. /// <param name="type"></param>
  147. /// <returns></returns>
  148. private string GetFilePath(LogType type)
  149. {
  150. string filePath = LogPath;
  151. switch (type)
  152. {
  153. case LogType.d: filePath = DirTool.Combine(LogPath, "debug"); break;
  154. case LogType.i: filePath = DirTool.Combine(LogPath, "information"); break;
  155. case LogType.e: filePath = DirTool.Combine(LogPath, "error"); break;
  156. case LogType.w: filePath = DirTool.Combine(LogPath, "warning"); break;
  157. case LogType.v: filePath = DirTool.Combine(LogPath, "verbose"); break;
  158. }
  159. return filePath;
  160. }
  161. /// <summary>
  162. /// 清理过多的日志文件
  163. /// </summary>
  164. private void Cleaner(LogType type)
  165. {
  166. List<string> files = FileTool.GetFile(GetFilePath(type));
  167. if (ListTool.HasElements(files))
  168. {
  169. files.ForEach(f =>
  170. {
  171. try
  172. {
  173. string filename = Path.GetFileNameWithoutExtension(f);
  174. if (filename.Length == 10)
  175. {
  176. DateTime date = DateTime.Parse(filename);
  177. if (date < DateTime.Now.AddDays(-CACHE_DAYS - 1)) FileTool.Delete(f);
  178. }
  179. else { FileTool.Delete(f); }
  180. }
  181. catch { FileTool.Delete(f); }
  182. });
  183. }
  184. }
  185. #region 分类详细输出
  186. /// <summary>
  187. /// 输出 verbose (啰嗦信息)
  188. /// </summary>
  189. /// <param name="message">消息</param>
  190. /// <param name="tag">可选:标记</param>
  191. public void v<T>(T msg)
  192. {
  193. if ((LogLevel & LogLevel.Verbose) == LogLevel.Verbose)
  194. Write(LogType.v, msg.ToString());
  195. }
  196. /// <summary>
  197. /// 输出 Debug (调试信息)
  198. /// </summary>
  199. /// <param name="message">消息</param>
  200. /// <param name="tag">可选:标记</param>
  201. public void d<T>(T msg)
  202. {
  203. if ((LogLevel & LogLevel.Debug) == LogLevel.Debug)
  204. Write(LogType.d, msg.ToString());
  205. }
  206. /// <summary>
  207. /// 输出 Information (重要信息)
  208. /// </summary>
  209. /// <param name="message">消息</param>
  210. /// <param name="tag">可选:标记</param>
  211. public void i<T>(T msg)
  212. {
  213. if ((LogLevel & LogLevel.Information) == LogLevel.Information)
  214. Write(LogType.i, msg.ToString());
  215. }
  216. /// <summary>
  217. /// 输出 Warning (警告信息)
  218. /// </summary>
  219. /// <param name="message">消息</param>
  220. /// <param name="tag">可选:标记</param>
  221. public void w<T>(T msg)
  222. {
  223. if ((LogLevel & LogLevel.Warning) == LogLevel.Warning)
  224. Write(LogType.w, msg.ToString());
  225. }
  226. /// <summary>
  227. /// 输出 Error (错误信息)
  228. /// </summary>
  229. /// <param name="message">消息</param>
  230. /// <param name="tag">可选:标记</param>
  231. public void e<T>(T msg)
  232. {
  233. if ((LogLevel & LogLevel.Error) == LogLevel.Error)
  234. Write(LogType.e, msg.ToString());
  235. }
  236. /// <summary>
  237. /// 输出 Colorful (炫彩信息)
  238. /// </summary>
  239. /// <typeparam name="T"></typeparam>
  240. /// <param name="color"></param>
  241. /// <param name="msg"></param>
  242. public void c<T>(ConsoleColor color, T msg)
  243. {
  244. if ((LogLevel & LogLevel.Colorful) == LogLevel.Colorful)
  245. Write(LogType.c, msg.ToString(), color);
  246. }
  247. #endregion
  248. }
  249. }