SimpleLog.hpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. #pragma once
  2. #include <time.h>
  3. #include <sys/timeb.h>
  4. #include "String.Format.tlh"
  5. #include "ErrorCodeToString.hpp"
  6. #define __LOG__SimpleLog__
  7. //-----------------------------------------------------------------------------
  8. // SimpleLog
  9. //-----------------------------------------------------------------------------
  10. class SimpleLog
  11. {
  12. public:
  13. enum enLogLevel
  14. {
  15. enUndefined = 0,
  16. enDebug = 10,
  17. enInfo = 20,
  18. enNotice = 30,
  19. enWarn = 40,
  20. enError = 50,
  21. enFatal = 60
  22. };
  23. public:
  24. inline static enLogLevel gLogLevel = enLogLevel::enUndefined;
  25. private:
  26. FILE * fpLog = nullptr;
  27. static inline char LogLevelToChar (int level)
  28. {
  29. // static char Name [6] = { ' ', ' ', ' ', 'W', 'E', 'F' };
  30. if (level == enWarn) return 'W';
  31. if (level == enError) return 'E';
  32. if (level == enFatal) return 'F';
  33. return ' ';
  34. }
  35. public:
  36. SimpleLog () = default;
  37. SimpleLog (const char * LogName)
  38. {
  39. Open (LogName);
  40. }
  41. bool Open (const char * LogName)
  42. {
  43. if (fpLog) fclose (fpLog);
  44. char AppPath [_MAX_PATH + _MAX_PATH];
  45. int len = GetModuleFileName (NULL, AppPath, _MAX_PATH);
  46. len--;
  47. while (AppPath [len] != '\\')
  48. AppPath [len--] = '\0';
  49. struct timeb tp;
  50. ftime (&tp);
  51. tm tmNow;
  52. _localtime64_s (&tmNow, &tp.time);
  53. auto Y = tmNow.tm_year + 1900;
  54. auto M = tmNow.tm_mon + 1;
  55. auto D = tmNow.tm_mday;
  56. auto H = tmNow.tm_hour;
  57. auto T = tmNow.tm_min;
  58. auto S = tmNow.tm_sec;
  59. char logFileName [_MAX_PATH];
  60. ECOM::Utility::String::StringFormat (logFileName, _MAX_PATH)
  61. .Format ("{$}\\Log\\{$}.{$:d04}{$:d02}{$:d02}.log",
  62. AppPath, LogName, Y, M, D);
  63. fpLog = fopen (logFileName, "ab+");
  64. assert (fpLog);
  65. return (fpLog != NULL);
  66. }
  67. void Close ()
  68. {
  69. if (fpLog)
  70. fclose (fpLog);
  71. fpLog = nullptr;
  72. }
  73. public:
  74. template <typename... Args>
  75. inline int Force (const char * fmt, Args && ... args)
  76. {
  77. return LogOut (enDebug, fmt, std::forward <Args> (args)...);
  78. }
  79. template <typename... Args>
  80. inline int Debug (const char * fmt, Args && ... args)
  81. {
  82. if (gLogLevel > enLogLevel::enDebug) return 0;
  83. return LogOut (enDebug, fmt, std::forward <Args> (args)...);
  84. }
  85. template <typename... Args>
  86. inline int Info (const char * fmt, Args && ... args)
  87. {
  88. if (gLogLevel > enLogLevel::enInfo) return 0;
  89. return LogOut (enInfo, fmt, std::forward <Args> (args)...);
  90. }
  91. template <typename... Args>
  92. inline int Notice (const char * fmt, Args && ... args)
  93. {
  94. if (gLogLevel > enLogLevel::enNotice) return 0;
  95. return LogOut (enInfo, fmt, std::forward <Args> (args)...);
  96. }
  97. template <typename... Args>
  98. inline int Warn (const char * fmt, Args && ... args)
  99. {
  100. if (gLogLevel > enLogLevel::enWarn) return 0;
  101. return LogOut (enWarn, fmt, std::forward <Args> (args)...);
  102. }
  103. template <typename... Args>
  104. inline int Error (const char * fmt, Args && ... args)
  105. {
  106. if (gLogLevel > enLogLevel::enError) return 0;
  107. return LogOut (enError, fmt, std::forward <Args> (args)...);
  108. }
  109. template <typename... Args>
  110. inline int Fatal (const char * fmt, Args && ... args)
  111. {
  112. if (gLogLevel > enLogLevel::enFatal) return 0;
  113. return LogOut (enFatal, fmt, std::forward <Args> (args)...);
  114. }
  115. int Flush (const char * buf, int len)
  116. {
  117. assert (buf);
  118. assert (fpLog);
  119. if (! fpLog) return 0;
  120. auto rc = (int) fwrite (buf, len, 1, fpLog);
  121. fflush (fpLog);
  122. return rc;
  123. }
  124. protected:
  125. template <typename... Args>
  126. inline int LogOut (int Level, const char * fmt, Args && ... args)
  127. {
  128. if (! fpLog) return 0;
  129. static const int MaxLen = 8192;
  130. char * buf = new char [MaxLen];
  131. struct timeb tp;
  132. ftime (&tp);
  133. tm tmNow;
  134. _localtime64_s (&tmNow, &tp.time);
  135. auto Y = tmNow.tm_year + 1900;
  136. auto M = tmNow.tm_mon + 1;
  137. auto D = tmNow.tm_mday;
  138. auto H = tmNow.tm_hour;
  139. auto T = tmNow.tm_min;
  140. auto S = tmNow.tm_sec;
  141. int len1 = ECOM::Utility::String::StringFormat (buf, MaxLen).Format ("{$} {$:d04}{$:d02}{$:d02} {$:d02}:{$:d02}:{$:d02}:{$:d03} [{$:x04}] ",
  142. LogLevelToChar (Level), Y, M, D, H, T, S, tp.millitm, GetCurrentThreadId ());
  143. int len2 = ECOM::Utility::String::StringFormat (buf+len1, MaxLen-len1).Format (fmt, std::forward <Args> (args)...);
  144. buf [len1 + len2 + 0] = '\r';
  145. buf [len1 + len2 + 1] = '\n';
  146. return Flush (buf, len1+len2+2 );
  147. }
  148. };
  149. //-----------------------------------------------------------------------------
  150. // mLog 是对 gLogger 的简单封装
  151. // mLog 可以理解为 myLog, 或者 mainLog 的短名称
  152. //-----------------------------------------------------------------------------
  153. namespace mLog
  154. {
  155. inline SimpleLog gLogger;
  156. inline std::string ErrorCodeToString (DWORD errCode)
  157. {
  158. return ::ErrorCodeToString (errCode);
  159. }
  160. inline void Flush (const char * buf, int len)
  161. {
  162. gLogger.Flush (buf, len);
  163. }
  164. inline void NewLine ()
  165. {
  166. gLogger.Flush ("\r\n", 2);
  167. }
  168. template <typename... Args>
  169. inline void Force (const char * fmt, Args && ... args)
  170. {
  171. // assert (gLogger);
  172. // if (! gLogger) return;
  173. gLogger.Force (fmt, std::forward <Args> (args)...);
  174. }
  175. template <typename... Args>
  176. inline void Trace (const char * fmt, Args && ... args)
  177. {
  178. // assert (gLogger);
  179. // if (! gLogger) return;
  180. gLogger.Trace (fmt, std::forward <Args> (args)...);
  181. }
  182. template <typename... Args>
  183. inline void Debug (const char * fmt, Args && ... args)
  184. {
  185. // assert (gLogger);
  186. // if (! gLogger) return;
  187. gLogger.Debug (fmt, std::forward <Args> (args)...);
  188. }
  189. template <typename... Args>
  190. inline void Info (const char * fmt, Args && ... args)
  191. {
  192. // assert (gLogger);
  193. // if (! gLogger) return;
  194. gLogger.Info (fmt, std::forward <Args> (args)...);
  195. }
  196. template <typename... Args>
  197. inline void Notice (const char * fmt, Args && ... args)
  198. {
  199. // assert (gLogger);
  200. // if (! gLogger) return;
  201. gLogger.Notice (fmt, std::forward <Args> (args)...);
  202. }
  203. template <typename... Args>
  204. inline void Warn (const char * fmt, Args && ... args)
  205. {
  206. // assert (gLogger);
  207. // if (! gLogger) return;
  208. gLogger.Warn (fmt, std::forward <Args> (args)...);
  209. }
  210. template <typename... Args>
  211. inline void Warning (const char * fmt, Args && ... args)
  212. {
  213. // assert (gLogger);
  214. // if (! gLogger) return;
  215. gLogger.Warn (fmt, std::forward <Args> (args)...);
  216. }
  217. template <typename... Args>
  218. inline void Error (const char * fmt, Args && ... args)
  219. {
  220. // assert (gLogger);
  221. // if (! gLogger) return;
  222. gLogger.Error (fmt, std::forward <Args> (args)...);
  223. }
  224. template <typename... Args>
  225. inline void Fatal (const char * fmt, Args && ... args)
  226. {
  227. // assert (gLogger);
  228. // if (! gLogger) return;
  229. gLogger.Fatal (fmt, std::forward <Args> (args)...);
  230. }
  231. inline bool Open (const char * LogName)
  232. {
  233. return gLogger.Open (LogName);
  234. }
  235. inline void Close ()
  236. {
  237. // assert (gLogger);
  238. // if (! gLogger) return;
  239. gLogger.Close ();
  240. }
  241. };