logger.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. /*
  2. * Tencent is pleased to support the open source community by making wwsearch
  3. * available.
  4. *
  5. * Copyright (C) 2018-present Tencent. All Rights Reserved.
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  8. * use this file except in compliance with the License. You may obtain a copy of
  9. * the License at
  10. *
  11. * https://opensource.org/licenses/Apache-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  15. * WARRANTIES OF ANY KIND, either express or implied. See the License for the
  16. * specific language governing permissions and limitations under the License.
  17. */
  18. #pragma once
  19. #include <sys/epoll.h>
  20. #include <sys/mman.h>
  21. #include <sys/poll.h>
  22. #include <sys/prctl.h>
  23. #include <sys/select.h>
  24. #include <sys/socket.h>
  25. #include <sys/stat.h>
  26. #include <sys/syscall.h>
  27. #include <sys/time.h>
  28. #include <sys/types.h>
  29. #include <arpa/inet.h>
  30. #include <netinet/in.h>
  31. #include <netinet/tcp.h>
  32. #include <assert.h>
  33. #include <errno.h>
  34. #include <fcntl.h>
  35. #include <pthread.h>
  36. #include <sched.h>
  37. #include <signal.h>
  38. #include <stdarg.h>
  39. #include <stdint.h>
  40. #include <stdio.h>
  41. #include <stdlib.h>
  42. #include <string.h>
  43. #include <time.h>
  44. #include <unistd.h>
  45. const uint32_t kSearchLogBufSize = 8192;
  46. extern __thread char g_search_log_buffer[kSearchLogBufSize];
  47. extern uint32_t g_search_log_level;
  48. extern bool g_search_use_log;
  49. extern uint32_t g_search_use_console;
  50. namespace wwsearch {
  51. class Logger;
  52. }
  53. extern wwsearch::Logger* g_logger;
  54. namespace wwsearch {
  55. /* Notice : Logger base class. Default implement to printf in console.
  56. * Support users to implement yourself logger by inherit from Logger class.
  57. */
  58. enum SearchLogLevel {
  59. kSearchLogLevelZero = 0,
  60. kSearchLogLevelFatal = 0,
  61. kSearchLogLevelImpt = 0,
  62. kSearchLogLevelError = 1,
  63. kSearchLogLevelWarn = 2,
  64. kSearchLogLevelInfo = 3,
  65. kSearchLogLevelDebug = 4,
  66. };
  67. class Logger {
  68. public:
  69. // Set Log leel
  70. static void SetLogLevel(uint32_t level, bool use_search_log = true) {
  71. g_search_log_level = level;
  72. g_search_use_log = use_search_log;
  73. }
  74. // Set outer logger implement
  75. static void SetLogger(Logger* logger,
  76. SearchLogLevel level = kSearchLogLevelError) {
  77. if (NULL == g_logger) {
  78. g_logger = logger;
  79. }
  80. Logger::SetLogLevel(level, true);
  81. }
  82. // Write Info Log
  83. virtual void WriteInfo(const char* log_buffer) = 0;
  84. // Write Error Log
  85. virtual void WriteErr(const char* log_buffer) = 0;
  86. // Write Debug Log
  87. virtual void WriteDebug(const char* log_buffer) = 0;
  88. };
  89. // Default logger
  90. class DefaultLoggerImpl : public Logger {
  91. public:
  92. DefaultLoggerImpl();
  93. ~DefaultLoggerImpl() {}
  94. public:
  95. void WriteInfo(const char* log_buffer);
  96. void WriteErr(const char* log_buffer);
  97. void WriteDebug(const char* log_buffer);
  98. private:
  99. void WriteLog(const char* pcBuffer);
  100. };
  101. #define SimpleSearchLog(fmt, args...) \
  102. do { \
  103. assert(g_logger != NULL); \
  104. int __iLen = \
  105. snprintf(g_search_log_buffer, kSearchLogBufSize, " %s:%s:%u " fmt "", \
  106. __FILE__, __FUNCTION__, __LINE__, ##args); \
  107. if (__iLen > int(kSearchLogBufSize)) __iLen = kSearchLogBufSize; \
  108. } while (0);
  109. #define SearchLog(__level, fmt, args...) \
  110. do { \
  111. assert(g_logger != NULL); \
  112. struct timeval __now_tv; \
  113. gettimeofday(&__now_tv, NULL); \
  114. const time_t __seconds = __now_tv.tv_sec; \
  115. struct tm __t; \
  116. localtime_r(&__seconds, &__t); \
  117. int __iLen = \
  118. snprintf(g_search_log_buffer, kSearchLogBufSize, \
  119. "%04d/%02d/%02d-%02d:%02d:%02d.%06d %s %s:%s:%u " fmt "", \
  120. __t.tm_year + 1900, __t.tm_mon + 1, __t.tm_mday, __t.tm_hour, \
  121. __t.tm_min, __t.tm_sec, static_cast<int>(__now_tv.tv_usec), \
  122. __level, __FILE__, __FUNCTION__, __LINE__, ##args); \
  123. if (__iLen > int(kSearchLogBufSize)) __iLen = kSearchLogBufSize; \
  124. } while (0);
  125. #define EnableDebugLog (g_search_log_level >= wwsearch::kSearchLogLevelDebug)
  126. #define SearchLogDebug(fmt, args...) \
  127. do { \
  128. if (g_search_log_level < wwsearch::kSearchLogLevelDebug) break; \
  129. if (g_search_use_log) { \
  130. SearchLog("Debug", fmt, ##args); \
  131. } else { \
  132. SimpleSearchLog(fmt, ##args); \
  133. } \
  134. g_logger->WriteDebug(g_search_log_buffer); \
  135. } while (0);
  136. #define SearchLogInfo(fmt, args...) \
  137. do { \
  138. if (g_search_log_level < wwsearch::kSearchLogLevelInfo) break; \
  139. if (g_search_use_log) { \
  140. SearchLog("Info", fmt, ##args); \
  141. } else { \
  142. SimpleSearchLog(fmt, ##args); \
  143. } \
  144. g_logger->WriteInfo(g_search_log_buffer); \
  145. } while (0);
  146. #define SearchLogWarn(fmt, args...) \
  147. do { \
  148. if (g_search_log_level < wwsearch::kSearchLogLevelWarn) break; \
  149. if (g_search_use_log) { \
  150. SearchLog("Warn", fmt, ##args); \
  151. } else { \
  152. SimpleSearchLog(fmt, ##args); \
  153. } \
  154. g_logger->WriteErr(g_search_log_buffer); \
  155. } while (0);
  156. #define SearchLogError(fmt, args...) \
  157. do { \
  158. if (g_search_log_level < wwsearch::kSearchLogLevelError) break; \
  159. if (g_search_use_log) { \
  160. SearchLog("Error", fmt, ##args); \
  161. } else { \
  162. SimpleSearchLog(fmt, ##args); \
  163. } \
  164. g_logger->WriteErr(g_search_log_buffer); \
  165. } while (0);
  166. #define SearchLogImpt(fmt, args...) \
  167. do { \
  168. if (g_search_log_level < wwsearch::kSearchLogLevelImpt) break; \
  169. if (g_search_use_log) { \
  170. SearchLog("Impt", fmt, ##args); \
  171. } else { \
  172. SimpleSearchLog(fmt, ##args); \
  173. } \
  174. g_logger->WriteErr(g_search_log_buffer); \
  175. } while (0);
  176. #define SearchLogFatal(fmt, args...) \
  177. do { \
  178. wwsearch::OSS::ReportFatalErr(); \
  179. if (g_search_use_log) { \
  180. SearchLog("Fatal", fmt, ##args); \
  181. } else { \
  182. SimpleSearchLog(fmt, ##args); \
  183. } \
  184. g_logger->WriteErr(g_search_log_buffer); \
  185. } while (0);
  186. #define SearchLogZero(fmt, args...) \
  187. do { \
  188. if (g_search_use_log) { \
  189. SearchLog("Zero", fmt, ##args); \
  190. } else { \
  191. SimpleSearchLog(fmt, ##args); \
  192. } \
  193. g_logger->WriteErr(g_search_log_buffer); \
  194. } while (0);
  195. } // namespace wwsearch