You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

302 lines
9.9 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. using System;
  2. // ReSharper disable InconsistentNaming
  3. namespace IPA.Logging
  4. {
  5. /// <summary>
  6. /// The logger base class. Provides the format for console logs.
  7. /// </summary>
  8. public abstract class Logger
  9. {
  10. private static Logger _log;
  11. internal static Logger log
  12. {
  13. get
  14. {
  15. if (_log == null)
  16. _log = new StandardLogger("IPA");
  17. return _log;
  18. }
  19. }
  20. private static StandardLogger _stdout;
  21. internal static StandardLogger stdout
  22. {
  23. get
  24. {
  25. if (_stdout == null)
  26. _stdout = new StandardLogger("_");
  27. return _stdout;
  28. }
  29. }
  30. internal static Logger updater => log.GetChildLogger("Updater");
  31. internal static Logger libLoader => log.GetChildLogger("LibraryLoader");
  32. internal static Logger loader => log.GetChildLogger("Loader");
  33. internal static Logger features => loader.GetChildLogger("Features");
  34. internal static Logger config => log.GetChildLogger("Config");
  35. internal static bool LogCreated => _log != null;
  36. /// <summary>
  37. /// The standard format for log messages.
  38. /// </summary>
  39. /// <value>the format for the standard loggers to print in</value>
  40. public static string LogFormat { get; protected internal set; } = "[{3} @ {2:HH:mm:ss} | {1}] {0}";
  41. /// <summary>
  42. /// An enum specifying the level of the message. Resembles Syslog.
  43. /// </summary>
  44. public enum Level : byte
  45. {
  46. /// <summary>
  47. /// No associated level. These never get shown.
  48. /// </summary>
  49. None = 0,
  50. /// <summary>
  51. /// A trace message. These are ignored *incredibly* early.
  52. /// </summary>
  53. Trace = 64,
  54. /// <summary>
  55. /// A debug message.
  56. /// </summary>
  57. Debug = 1,
  58. /// <summary>
  59. /// An informational message.
  60. /// </summary>
  61. Info = 2,
  62. /// <summary>
  63. /// A notice. More significant than Info, but less than a warning.
  64. /// </summary>
  65. Notice = 32,
  66. /// <summary>
  67. /// A warning message.
  68. /// </summary>
  69. Warning = 4,
  70. /// <summary>
  71. /// An error message.
  72. /// </summary>
  73. Error = 8,
  74. /// <summary>
  75. /// A critical error message.
  76. /// </summary>
  77. Critical = 16
  78. }
  79. /// <summary>
  80. /// An enum providing log level filters.
  81. /// </summary>
  82. [Flags]
  83. public enum LogLevel : byte
  84. {
  85. /// <summary>
  86. /// Allow no messages through.
  87. /// </summary>
  88. None = Level.None,
  89. /// <summary>
  90. /// Only shows Trace messages.
  91. /// </summary>
  92. TraceOnly = Level.Trace,
  93. /// <summary>
  94. /// Only shows Debug messages.
  95. /// </summary>
  96. DebugOnly = Level.Debug,
  97. /// <summary>
  98. /// Only shows info messages.
  99. /// </summary>
  100. InfoOnly = Level.Info,
  101. /// <summary>
  102. /// Only shows notice messages.
  103. /// </summary>
  104. NoticeOnly = Level.Notice,
  105. /// <summary>
  106. /// Only shows Warning messages.
  107. /// </summary>
  108. WarningOnly = Level.Warning,
  109. /// <summary>
  110. /// Only shows Error messages.
  111. /// </summary>
  112. ErrorOnly = Level.Error,
  113. /// <summary>
  114. /// Only shows Critical messages.
  115. /// </summary>
  116. CriticalOnly = Level.Critical,
  117. /// <summary>
  118. /// Shows all messages error and up.
  119. /// </summary>
  120. ErrorUp = ErrorOnly | CriticalOnly,
  121. /// <summary>
  122. /// Shows all messages warning and up.
  123. /// </summary>
  124. WarningUp = WarningOnly | ErrorUp,
  125. /// <summary>
  126. /// Shows all messages Notice and up.
  127. /// </summary>
  128. NoticeUp = WarningUp | NoticeOnly,
  129. /// <summary>
  130. /// Shows all messages info and up.
  131. /// </summary>
  132. InfoUp = InfoOnly | NoticeUp,
  133. /// <summary>
  134. /// Shows all messages debug and up.
  135. /// </summary>
  136. DebugUp = DebugOnly | InfoUp,
  137. /// <summary>
  138. /// Shows all messages.
  139. /// </summary>
  140. All = TraceOnly | DebugUp,
  141. /// <summary>
  142. /// Used for when the level is undefined.
  143. /// </summary>
  144. Undefined = byte.MaxValue
  145. }
  146. /// <summary>
  147. /// A basic log function.
  148. /// </summary>
  149. /// <param name="level">the level of the message</param>
  150. /// <param name="message">the message to log</param>
  151. public abstract void Log(Level level, string message);
  152. /// <summary>
  153. /// A basic log function taking an exception to log.
  154. /// </summary>
  155. /// <param name="level">the level of the message</param>
  156. /// <param name="e">the exception to log</param>
  157. public virtual void Log(Level level, Exception e) => Log(level, e.ToString());
  158. /// <summary>
  159. /// Sends a trace message.
  160. /// Equivalent to `Log(Level.Trace, message);`
  161. /// </summary>
  162. /// <seealso cref="Log(Level, string)"/>
  163. /// <param name="message">the message to log</param>
  164. public virtual void Trace(string message) => Log(Level.Trace, message);
  165. /// <summary>
  166. /// Sends an exception as a trace message.
  167. /// Equivalent to `Log(Level.Trace, e);`
  168. /// </summary>
  169. /// <seealso cref="Log(Level, Exception)"/>
  170. /// <param name="e">the exception to log</param>
  171. public virtual void Trace(Exception e) => Log(Level.Trace, e);
  172. /// <summary>
  173. /// Sends a debug message.
  174. /// Equivalent to `Log(Level.Debug, message);`
  175. /// </summary>
  176. /// <seealso cref="Log(Level, string)"/>
  177. /// <param name="message">the message to log</param>
  178. public virtual void Debug(string message) => Log(Level.Debug, message);
  179. /// <summary>
  180. /// Sends an exception as a debug message.
  181. /// Equivalent to `Log(Level.Debug, e);`
  182. /// </summary>
  183. /// <seealso cref="Log(Level, Exception)"/>
  184. /// <param name="e">the exception to log</param>
  185. public virtual void Debug(Exception e) => Log(Level.Debug, e);
  186. /// <summary>
  187. /// Sends an info message.
  188. /// Equivalent to `Log(Level.Info, message);`
  189. /// </summary>
  190. /// <seealso cref="Log(Level, string)"/>
  191. /// <param name="message">the message to log</param>
  192. public virtual void Info(string message) => Log(Level.Info, message);
  193. /// <summary>
  194. /// Sends an exception as an info message.
  195. /// Equivalent to `Log(Level.Info, e);`
  196. /// </summary>
  197. /// <seealso cref="Log(Level, Exception)"/>
  198. /// <param name="e">the exception to log</param>
  199. public virtual void Info(Exception e) => Log(Level.Info, e);
  200. /// <summary>
  201. /// Sends a notice message.
  202. /// Equivalent to `Log(Level.Notice, message);`
  203. /// </summary>
  204. /// <seealso cref="Log(Level, string)"/>
  205. /// <param name="message">the message to log</param>
  206. public virtual void Notice(string message) => Log(Level.Notice, message);
  207. /// <summary>
  208. /// Sends an exception as a notice message.
  209. /// Equivalent to `Log(Level.Notice, e);`
  210. /// </summary>
  211. /// <seealso cref="Log(Level, Exception)"/>
  212. /// <param name="e">the exception to log</param>
  213. public virtual void Notice(Exception e) => Log(Level.Notice, e);
  214. /// <summary>
  215. /// Sends a warning message.
  216. /// Equivalent to `Log(Level.Warning, message);`
  217. /// </summary>
  218. /// <seealso cref="Log(Level, string)"/>
  219. /// <param name="message">the message to log</param>
  220. public virtual void Warn(string message) => Log(Level.Warning, message);
  221. /// <summary>
  222. /// Sends an exception as a warning message.
  223. /// Equivalent to `Log(Level.Warning, e);`
  224. /// </summary>
  225. /// <seealso cref="Log(Level, Exception)"/>
  226. /// <param name="e">the exception to log</param>
  227. public virtual void Warn(Exception e) => Log(Level.Warning, e);
  228. /// <summary>
  229. /// Sends an error message.
  230. /// Equivalent to `Log(Level.Error, message);`
  231. /// </summary>
  232. /// <seealso cref="Log(Level, string)"/>
  233. /// <param name="message">the message to log</param>
  234. public virtual void Error(string message) => Log(Level.Error, message);
  235. /// <summary>
  236. /// Sends an exception as an error message.
  237. /// Equivalent to `Log(Level.Error, e);`
  238. /// </summary>
  239. /// <seealso cref="Log(Level, Exception)"/>
  240. /// <param name="e">the exception to log</param>
  241. public virtual void Error(Exception e) => Log(Level.Error, e);
  242. /// <summary>
  243. /// Sends a critical message.
  244. /// Equivalent to `Log(Level.Critical, message);`
  245. /// </summary>
  246. /// <seealso cref="Log(Level, string)"/>
  247. /// <param name="message">the message to log</param>
  248. public virtual void Critical(string message) => Log(Level.Critical, message);
  249. /// <summary>
  250. /// Sends an exception as a critical message.
  251. /// Equivalent to `Log(Level.Critical, e);`
  252. /// </summary>
  253. /// <seealso cref="Log(Level, Exception)"/>
  254. /// <param name="e">the exception to log</param>
  255. public virtual void Critical(Exception e) => Log(Level.Critical, e);
  256. }
  257. }