quill
LogFunctions.h
1 
7 #pragma once
8 
9 #include "quill/core/Attributes.h"
10 #include "quill/core/Common.h"
11 #include "quill/core/LogLevel.h"
12 #include "quill/core/MacroMetadata.h"
13 #include "quill/core/SourceLocation.h"
14 
15 #include <string>
16 #include <type_traits>
17 #include <utility>
18 
19 QUILL_BEGIN_NAMESPACE
20 
53 struct Tags
54 {
55  Tags() = default;
56 
61  explicit Tags(char const* tag)
62  {
63  if (QUILL_UNLIKELY(!tag))
64  {
65  return;
66  }
67 
68  _value += tag;
69  _value += ' ';
70  }
71 
78  template <typename... RestTags>
79  Tags(char const* first_tag, char const* second_tag, RestTags... rest_tags)
80  {
81  static_assert(std::conjunction_v<std::is_same<char const*, RestTags>...>,
82  "All tag parameters must be of type 'char const*'");
83 
84  append_tag(first_tag);
85  append_tag(second_tag);
86  (append_tag(rest_tags), ...);
87  _value += ' ';
88  }
89 
90  // Get the combined tags string
91  QUILL_NODISCARD char const* value() const noexcept { return _value.c_str(); }
92 
93 private:
94  std::string _value{'#'};
95 
96  void append_tag(char const* tag)
97  {
98  if (QUILL_UNLIKELY(!tag))
99  {
100  return;
101  }
102 
103  if (_value.size() > 1)
104  {
105  // when not empty, 1 is for initial '#'
106  _value += " #";
107  }
108 
109  _value += tag;
110  }
111 };
112 
113 template <typename TLogger, typename... Args>
114 struct tracel3
115 {
116  tracel3(TLogger* logger, char const* fmt, Args&&... args, SourceLocation location = SourceLocation::current())
117  {
118  log(logger, "", LogLevel::TraceL3, fmt, location, std::forward<Args>(args)...);
119  }
120 
121  tracel3(TLogger* logger, Tags const& tags, char const* fmt, Args&&... args,
122  SourceLocation location = SourceLocation::current())
123  {
124  log(logger, tags.value(), LogLevel::TraceL3, fmt, location, std::forward<Args>(args)...);
125  }
126 };
127 
128 template <typename TLogger, typename... Args>
129 tracel3(TLogger*, char const*, Args&&...) -> tracel3<TLogger, Args...>;
130 
131 template <typename TLogger, typename... Args>
132 tracel3(TLogger*, Tags const& tags, char const*, Args&&...) -> tracel3<TLogger, Args...>;
133 
134 template <typename TLogger, typename... Args>
135 struct tracel2
136 {
137  tracel2(TLogger* logger, char const* fmt, Args&&... args, SourceLocation location = SourceLocation::current())
138  {
139  log(logger, "", LogLevel::TraceL2, fmt, location, std::forward<Args>(args)...);
140  }
141 
142  tracel2(TLogger* logger, Tags const& tags, char const* fmt, Args&&... args,
143  SourceLocation location = SourceLocation::current())
144  {
145  log(logger, tags.value(), LogLevel::TraceL2, fmt, location, std::forward<Args>(args)...);
146  }
147 };
148 
149 template <typename TLogger, typename... Args>
150 tracel2(TLogger*, char const*, Args&&...) -> tracel2<TLogger, Args...>;
151 
152 template <typename TLogger, typename... Args>
153 tracel2(TLogger*, Tags const& tags, char const*, Args&&...) -> tracel2<TLogger, Args...>;
154 
155 template <typename TLogger, typename... Args>
156 struct tracel1
157 {
158  tracel1(TLogger* logger, char const* fmt, Args&&... args, SourceLocation location = SourceLocation::current())
159  {
160  log(logger, "", LogLevel::TraceL1, fmt, location, std::forward<Args>(args)...);
161  }
162 
163  tracel1(TLogger* logger, Tags const& tags, char const* fmt, Args&&... args,
164  SourceLocation location = SourceLocation::current())
165  {
166  log(logger, tags.value(), LogLevel::TraceL1, fmt, location, std::forward<Args>(args)...);
167  }
168 };
169 
170 template <typename TLogger, typename... Args>
171 tracel1(TLogger*, char const*, Args&&...) -> tracel1<TLogger, Args...>;
172 
173 template <typename TLogger, typename... Args>
174 tracel1(TLogger*, Tags const& tags, char const*, Args&&...) -> tracel1<TLogger, Args...>;
175 
176 template <typename TLogger, typename... Args>
177 struct debug
178 {
179  debug(TLogger* logger, char const* fmt, Args&&... args, SourceLocation location = SourceLocation::current())
180  {
181  log(logger, "", LogLevel::Debug, fmt, location, std::forward<Args>(args)...);
182  }
183 
184  debug(TLogger* logger, Tags const& tags, char const* fmt, Args&&... args,
185  SourceLocation location = SourceLocation::current())
186  {
187  log(logger, tags.value(), LogLevel::Debug, fmt, location, std::forward<Args>(args)...);
188  }
189 };
190 
191 template <typename TLogger, typename... Args>
192 debug(TLogger*, char const*, Args&&...) -> debug<TLogger, Args...>;
193 
194 template <typename TLogger, typename... Args>
195 debug(TLogger*, Tags const& tags, char const*, Args&&...) -> debug<TLogger, Args...>;
196 
197 template <typename TLogger, typename... Args>
198 struct info
199 {
200  info(TLogger* logger, char const* fmt, Args&&... args, SourceLocation location = SourceLocation::current())
201  {
202  log(logger, "", LogLevel::Info, fmt, location, std::forward<Args>(args)...);
203  }
204 
205  info(TLogger* logger, Tags const& tags, char const* fmt, Args&&... args,
206  SourceLocation location = SourceLocation::current())
207  {
208  log(logger, tags.value(), LogLevel::Info, fmt, location, std::forward<Args>(args)...);
209  }
210 };
211 
212 template <typename TLogger, typename... Args>
213 info(TLogger*, char const*, Args&&...) -> info<TLogger, Args...>;
214 
215 template <typename TLogger, typename... Args>
216 info(TLogger*, Tags const& tags, char const*, Args&&...) -> info<TLogger, Args...>;
217 
218 template <typename TLogger, typename... Args>
219 struct notice
220 {
221  notice(TLogger* logger, char const* fmt, Args&&... args, SourceLocation location = SourceLocation::current())
222  {
223  log(logger, "", LogLevel::Notice, fmt, location, std::forward<Args>(args)...);
224  }
225 
226  notice(TLogger* logger, Tags const& tags, char const* fmt, Args&&... args,
227  SourceLocation location = SourceLocation::current())
228  {
229  log(logger, tags.value(), LogLevel::Notice, fmt, location, std::forward<Args>(args)...);
230  }
231 };
232 
233 template <typename TLogger, typename... Args>
234 notice(TLogger*, char const*, Args&&...) -> notice<TLogger, Args...>;
235 
236 template <typename TLogger, typename... Args>
237 notice(TLogger*, Tags const& tags, char const*, Args&&...) -> notice<TLogger, Args...>;
238 
239 template <typename TLogger, typename... Args>
240 struct warning
241 {
242  warning(TLogger* logger, char const* fmt, Args&&... args, SourceLocation location = SourceLocation::current())
243  {
244  log(logger, "", LogLevel::Warning, fmt, location, std::forward<Args>(args)...);
245  }
246 
247  warning(TLogger* logger, Tags const& tags, char const* fmt, Args&&... args,
248  SourceLocation location = SourceLocation::current())
249  {
250  log(logger, tags.value(), LogLevel::Warning, fmt, location, std::forward<Args>(args)...);
251  }
252 };
253 
254 template <typename TLogger, typename... Args>
255 warning(TLogger*, char const*, Args&&...) -> warning<TLogger, Args...>;
256 
257 template <typename TLogger, typename... Args>
258 warning(TLogger*, Tags const& tags, char const*, Args&&...) -> warning<TLogger, Args...>;
259 
260 template <typename TLogger, typename... Args>
261 struct error
262 {
263  error(TLogger* logger, char const* fmt, Args&&... args, SourceLocation location = SourceLocation::current())
264  {
265  log(logger, "", LogLevel::Error, fmt, location, std::forward<Args>(args)...);
266  }
267 
268  error(TLogger* logger, Tags const& tags, char const* fmt, Args&&... args,
269  SourceLocation location = SourceLocation::current())
270  {
271  log(logger, tags.value(), LogLevel::Error, fmt, location, std::forward<Args>(args)...);
272  }
273 };
274 
275 template <typename TLogger, typename... Args>
276 error(TLogger*, char const*, Args&&...) -> error<TLogger, Args...>;
277 
278 template <typename TLogger, typename... Args>
279 error(TLogger*, Tags const& tags, char const*, Args&&...) -> error<TLogger, Args...>;
280 
281 template <typename TLogger, typename... Args>
282 struct critical
283 {
284  critical(TLogger* logger, char const* fmt, Args&&... args, SourceLocation location = SourceLocation::current())
285  {
286  log(logger, "", LogLevel::Critical, fmt, location, std::forward<Args>(args)...);
287  }
288 
289  critical(TLogger* logger, Tags const& tags, char const* fmt, Args&&... args,
290  SourceLocation location = SourceLocation::current())
291  {
292  log(logger, tags.value(), LogLevel::Critical, fmt, location, std::forward<Args>(args)...);
293  }
294 };
295 
296 template <typename TLogger, typename... Args>
297 critical(TLogger*, char const*, Args&&...) -> critical<TLogger, Args...>;
298 
299 template <typename TLogger, typename... Args>
300 critical(TLogger*, Tags const& tags, char const*, Args&&...) -> critical<TLogger, Args...>;
301 
302 template <typename TLogger, typename... Args>
303 struct backtrace
304 {
305  backtrace(TLogger* logger, char const* fmt, Args&&... args, SourceLocation location = SourceLocation::current())
306  {
307  log(logger, "", LogLevel::Backtrace, fmt, location, std::forward<Args>(args)...);
308  }
309 
310  backtrace(TLogger* logger, Tags const& tags, char const* fmt, Args&&... args,
311  SourceLocation location = SourceLocation::current())
312  {
313  log(logger, tags.value(), LogLevel::Backtrace, fmt, location, std::forward<Args>(args)...);
314  }
315 };
316 
317 template <typename TLogger, typename... Args>
318 backtrace(TLogger*, char const*, Args&&...) -> backtrace<TLogger, Args...>;
319 
320 template <typename TLogger, typename... Args>
321 backtrace(TLogger*, Tags const& tags, char const*, Args&&...) -> backtrace<TLogger, Args...>;
322 
323 /***/
324 template <typename TLogger, typename... Args>
325 QUILL_ATTRIBUTE_HOT void log(TLogger* logger, char const* tags, LogLevel log_level, char const* fmt,
326  SourceLocation const& location, Args&&... args)
327 {
328  static constexpr MacroMetadata macro_metadata{
329  "[placeholder]", "[placeholder]", "[placeholder]",
330  nullptr, LogLevel::None, MacroMetadata::Event::LogWithRuntimeMetadataHybridCopy};
331 
332  if (logger->should_log_statement(log_level))
333  {
334  logger->template log_statement_runtime_metadata<true>(
335  &macro_metadata, fmt, location.file_name(), location.function_name(), tags, location.line(),
336  log_level, std::forward<Args>(args)...);
337  }
338 }
339 
340 QUILL_END_NAMESPACE
Definition: LogFunctions.h:135
Definition: LogFunctions.h:219
Definition: LogFunctions.h:198
Captures and stores information about a logging event in compile time.
Definition: MacroMetadata.h:22
Tags(char const *tag)
Single tag constructor.
Definition: LogFunctions.h:61
Definition: LogFunctions.h:177
Definition: LogFunctions.h:261
Definition: LogFunctions.h:114
Definition: LogFunctions.h:240
Tags(char const *first_tag, char const *second_tag, RestTags... rest_tags)
Constructor for multiple tags.
Definition: LogFunctions.h:79
Definition: SourceLocation.h:40
Definition: LogFunctions.h:282
Definition: LogFunctions.h:156
Definition: LogFunctions.h:303
Macro-Free Logging Interface
Definition: LogFunctions.h:53