Agora  1.2.0
Agora project
logger.h
Go to the documentation of this file.
1 
6 #ifndef LOGGER_H_
7 #define LOGGER_H_
8 
9 #define AGORA_LOG_LEVEL_OFF (0)
10 #define AGORA_LOG_LEVEL_ERROR (1)
11 #define AGORA_LOG_LEVEL_WARN (2)
12 #define AGORA_LOG_LEVEL_INFO (3)
13 #define AGORA_LOG_LEVEL_FRAME (4)
14 #define AGORA_LOG_LEVEL_SYMBOL (5)
15 #define AGORA_LOG_LEVEL_TRACE (6)
16 
17 #if !defined(AGORA_LOG_LEVEL)
18 #define AGORA_LOG_LEVEL (AGORA_LOG_LEVEL_ERROR)
19 #endif
20 
21 #define AGORA_LOG_DEFAULT_STREAM (stdout)
22 #define AGORA_LOG_STREAM (AGORA_LOG_DEFAULT_STREAM)
23 
24 #if !defined(USE_SPDLOG)
25 
26 #include <ctime>
27 #include <string>
28 
29 // If AGORA_LOG_LEVEL is not defined, default to the highest level so that
30 // Log messages with "FRAME" or higher verbosity get written to
31 // mlpd_trace_file_or_default_stream. This can be stdout for basic debugging, or
32 // a file named "trace_file" for more involved debugging.
33 #define Agora_trace_file_or_default_stream (AGORA_LOG_DEFAULT_STREAM)
34 
35 #define AGORA_LOG_INIT() ((void)0);
36 #define AGORA_LOG_SHUTDOWN() ((void)0);
37 
38 #if AGORA_LOG_LEVEL >= AGORA_LOG_LEVEL_ERROR
39 #define AGORA_LOG_ERROR(...) \
40  AgoraOutputLogHeader(AGORA_LOG_DEFAULT_STREAM, AGORA_LOG_LEVEL_ERROR); \
41  std::fprintf(AGORA_LOG_DEFAULT_STREAM, __VA_ARGS__); \
42  std::fflush(AGORA_LOG_DEFAULT_STREAM)
43 #else
44 #define AGORA_LOG_ERROR(...) ((void)0)
45 #endif
46 
47 #if AGORA_LOG_LEVEL >= AGORA_LOG_LEVEL_WARN
48 #define AGORA_LOG_WARN(...) \
49  AgoraOutputLogHeader(AGORA_LOG_DEFAULT_STREAM, AGORA_LOG_LEVEL_WARN); \
50  std::fprintf(AGORA_LOG_DEFAULT_STREAM, __VA_ARGS__); \
51  std::fflush(AGORA_LOG_DEFAULT_STREAM)
52 #else
53 #define AGORA_LOG_WARN(...) ((void)0)
54 #endif
55 
56 #if AGORA_LOG_LEVEL >= AGORA_LOG_LEVEL_INFO
57 #define AGORA_LOG_INFO(...) \
58  AgoraOutputLogHeader(AGORA_LOG_DEFAULT_STREAM, AGORA_LOG_LEVEL_INFO); \
59  std::fprintf(AGORA_LOG_DEFAULT_STREAM, __VA_ARGS__); \
60  std::fflush(AGORA_LOG_DEFAULT_STREAM)
61 #else
62 #define AGORA_LOG_INFO(...) ((void)0)
63 #endif
64 
65 #if AGORA_LOG_LEVEL >= AGORA_LOG_LEVEL_FRAME
66 #define AGORA_LOG_FRAME(...) \
67  AgoraOutputLogHeader(Agora_trace_file_or_default_stream, \
68  AGORA_LOG_LEVEL_FRAME); \
69  std::fprintf(Agora_trace_file_or_default_stream, __VA_ARGS__); \
70  std::fflush(Agora_trace_file_or_default_stream)
71 #else
72 #define AGORA_LOG_FRAME(...) ((void)0)
73 #endif
74 
75 #if AGORA_LOG_LEVEL >= AGORA_LOG_LEVEL_SYMBOL
76 #define AGORA_LOG_SYMBOL(...) \
77  AgoraOutputLogHeader(Agora_trace_file_or_default_stream, \
78  AGORA_LOG_LEVEL_SYMBOL); \
79  std::fprintf(Agora_trace_file_or_default_stream, __VA_ARGS__); \
80  std::fflush(Agora_trace_file_or_default_stream)
81 #else
82 #define AGORA_LOG_SYMBOL(...) ((void)0)
83 #endif
84 
85 #if AGORA_LOG_LEVEL >= AGORA_LOG_LEVEL_TRACE
86 #define AGORA_LOG_TRACE(...) \
87  AgoraOutputLogHeader(Agora_trace_file_or_default_stream, \
88  AGORA_LOG_LEVEL_TRACE); \
89  std::fprintf(Agora_trace_file_or_default_stream, __VA_ARGS__); \
90  std::fflush(Agora_trace_file_or_default_stream)
91 #else
92 #define AGORA_LOG_TRACE(...) ((void)0)
93 #endif
94 
95 #else
96 
97 #include "spdlog/async.h"
98 #include "spdlog/fmt/bundled/printf.h" // support for printf-style
101 #include "spdlog/spdlog.h"
102 
103 constexpr size_t kLogThreadPoolQueueSize = 32768;
104 constexpr size_t kLogThreadCount = 1;
105 
106 #define AGORA_LOG_INIT() \
107  spdlog::init_thread_pool(kLogThreadPoolQueueSize, kLogThreadCount); \
108  spdlog::set_default_logger( \
109  spdlog::create_async_nb<spdlog::sinks::stdout_color_sink_mt>( \
110  "console")); \
111  auto f = std::make_unique<spdlog::pattern_formatter>( \
112  spdlog::pattern_time_type::utc, std::string("")); \
113  f->set_pattern("[%S:%f][%^%L%$] %v"); \
114  spdlog::set_formatter(std::move(f)); \
115  spdlog::set_level(SPDLOG_LEVEL);
116 
117 #define AGORA_LOG_SHUTDOWN() spdlog::shutdown();
118 
119 #if AGORA_LOG_LEVEL >= AGORA_LOG_LEVEL_ERROR
120 #define AGORA_LOG_ERROR(...) spdlog::error(fmt::sprintf(__VA_ARGS__));
121 #else
122 #define AGORA_LOG_ERROR(...) ((void)0)
123 #endif
124 
125 #if AGORA_LOG_LEVEL >= AGORA_LOG_LEVEL_WARN
126 #define AGORA_LOG_WARN(...) spdlog::warn(fmt::sprintf(__VA_ARGS__));
127 #else
128 #define AGORA_LOG_WARN(...) ((void)0)
129 #endif
130 
131 #if AGORA_LOG_LEVEL >= AGORA_LOG_LEVEL_INFO
132 #define AGORA_LOG_INFO(...) spdlog::info(fmt::sprintf(__VA_ARGS__));
133 #else
134 #define AGORA_LOG_INFO(...) ((void)0)
135 #endif
136 
137 #if AGORA_LOG_LEVEL >= AGORA_LOG_LEVEL_FRAME
138 #define AGORA_LOG_FRAME(...) spdlog::debug(fmt::sprintf(__VA_ARGS__));
139 #else
140 #define AGORA_LOG_FRAME(...) ((void)0)
141 #endif
142 
143 #if AGORA_LOG_LEVEL >= AGORA_LOG_LEVEL_SYMBOL
144 #define AGORA_LOG_SYMBOL(...) spdlog::debug(fmt::sprintf(__VA_ARGS__));
145 #else
146 #define AGORA_LOG_SYMBOL(...) ((void)0)
147 #endif
148 
149 #if AGORA_LOG_LEVEL >= AGORA_LOG_LEVEL_TRACE
150 #define AGORA_LOG_TRACE(...) spdlog::trace(fmt::sprintf(__VA_ARGS__));
151 #else
152 #define AGORA_LOG_TRACE(...) ((void)0)
153 #endif
154 
155 #endif
156 
158 static std::string AgoraGetFormattedTime() {
159  struct timespec t;
160  clock_gettime(CLOCK_REALTIME, &t);
161  char buf[20];
162  uint32_t seconds = t.tv_sec % 100; // Rollover every 100 seconds
163  uint32_t usec = t.tv_nsec / 1000;
164 
165  std::sprintf(buf, "%u:%06u", seconds, usec);
166  return std::string(buf);
167 }
168 // Output log message header
169 static inline void AgoraOutputLogHeader(FILE* stream, int level) {
170  std::string formatted_time = AgoraGetFormattedTime();
171 
172  const char* type;
173  switch (level) {
175  type = "ERROR";
176  break;
178  type = "WARNG";
179  break;
181  type = "INFOR";
182  break;
184  type = "FRAME";
185  break;
187  type = "SBFRM";
188  break;
190  type = "TRACE";
191  break;
192  default:
193  type = "UNKWN";
194  }
195  std::fprintf(stream, "%s %s: ", formatted_time.c_str(), type);
196 }
197 
200 static inline bool IsLogLevelReasonable() {
202 }
203 #endif // LOGGER_H_
AGORA_LOG_LEVEL_FRAME
#define AGORA_LOG_LEVEL_FRAME
Definition: logger.h:13
IsLogLevelReasonable
static bool IsLogLevelReasonable()
Definition: logger.h:200
AgoraOutputLogHeader
static void AgoraOutputLogHeader(FILE *stream, int level)
Definition: logger.h:169
async.h
AGORA_LOG_LEVEL_INFO
#define AGORA_LOG_LEVEL_INFO
Definition: logger.h:12
AGORA_LOG_LEVEL_SYMBOL
#define AGORA_LOG_LEVEL_SYMBOL
Definition: logger.h:14
AgoraGetFormattedTime
static std::string AgoraGetFormattedTime()
Return decent-precision time formatted as seconds:microseconds.
Definition: logger.h:158
printf.h
spdlog.h
stdout_color_sinks.h
fmt::v8::fprintf
auto fprintf(std::FILE *f, const S &fmt, const T &... args) -> int
Definition: printf.h:607
AGORA_LOG_LEVEL_WARN
#define AGORA_LOG_LEVEL_WARN
Definition: logger.h:11
AGORA_LOG_LEVEL_TRACE
#define AGORA_LOG_LEVEL_TRACE
Definition: logger.h:15
pattern_formatter.h
AGORA_LOG_LEVEL
#define AGORA_LOG_LEVEL
Definition: logger.h:18
fmt::v8::sprintf
auto sprintf(const S &fmt, const T &... args) -> std::basic_string< Char >
Definition: printf.h:579
fmt::v8::detail::type
type
Definition: core.h:1131
AGORA_LOG_LEVEL_ERROR
#define AGORA_LOG_LEVEL_ERROR
Definition: logger.h:10