20#include <trantor/exports.h>
31#define TRANTOR_IF_(cond) for (int _r = 0; _r == 0 && (cond); _r = 1)
39class TRANTOR_EXPORT Logger :
public NonCopyable
61 inline SourceFile(
const char (&arr)[N]) : data_(arr), size_(N - 1)
65 const char *slash = strrchr(data_,
'/');
67 const char *slash = strrchr(data_,
'\\');
72 size_ -=
static_cast<int>(data_ - arr);
76 explicit SourceFile(
const char *filename =
nullptr) : data_(filename)
84 const char *slash = strrchr(filename,
'/');
86 const char *slash = strrchr(filename,
'\\');
92 size_ =
static_cast<int>(strlen(data_));
99 Logger(
SourceFile file,
int line, LogLevel level);
100 Logger(
SourceFile file,
int line,
bool isSysErr);
101 Logger(
SourceFile file,
int line, LogLevel level,
const char *func);
105 Logger(LogLevel level);
106 Logger(
bool isSysErr);
109 Logger &setIndex(
int index)
125 std::function<
void(
const char *msg,
const uint64_t len)> outputFunc,
126 std::function<
void()> flushFunc,
131 outputFunc_() = outputFunc;
132 flushFunc_() = flushFunc;
136 outputFunc_(index) = outputFunc;
137 flushFunc_(index) = flushFunc;
166 return displayLocalTime_();
174 displayLocalTime_() = showLocalTime;
193 std::shared_ptr<spdlog::logger> logger = {});
201 inline static void enableSpdLog(std::shared_ptr<spdlog::logger> logger = {})
203 enableSpdLog(-1, logger);
267 static void defaultOutputFunction(
const char *msg,
const uint64_t len)
269 fwrite(msg, 1,
static_cast<size_t>(len), stdout);
271 static void defaultFlushFunction()
276 static bool &displayLocalTime_()
278 static bool showLocalTime =
false;
279 return showLocalTime;
282 static LogLevel &logLevel_()
285 static LogLevel logLevel = LogLevel::kInfo;
287 static LogLevel logLevel = LogLevel::kDebug;
291 static std::function<void(
const char *msg,
const uint64_t len)> &
294 static std::function<void(
const char *msg,
const uint64_t len)>
295 outputFunc = Logger::defaultOutputFunction;
298 static std::function<void()> &flushFunc_()
300 static std::function<void()> flushFunc = Logger::defaultFlushFunction;
303 static std::function<void(
const char *msg,
const uint64_t len)> &
304 outputFunc_(
size_t index)
307 std::function<void(
const char *msg,
const uint64_t len)>>
309 if (index < outputFuncs.size())
311 return outputFuncs[index];
313 while (index >= outputFuncs.size())
315 outputFuncs.emplace_back(outputFunc_());
317 return outputFuncs[index];
319 static std::function<void()> &flushFunc_(
size_t index)
321 static std::vector<std::function<void()>> flushFuncs;
322 if (index < flushFuncs.size())
324 return flushFuncs[index];
326 while (index >= flushFuncs.size())
328 flushFuncs.emplace_back(flushFunc_());
330 return flushFuncs[index];
332 friend class RawLogger;
333 LogStream logStream_;
334 Date date_{Date::now()};
335 SourceFile sourceFile_;
339 const char *func_{
nullptr};
340 std::size_t spdLogMessageOffset_{0};
363 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kTrace, __func__) \
367 TRANTOR_IF_(trantor::Logger::logLevel() <= trantor::Logger::kTrace) \
368 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kTrace, __func__) \
370#define LOG_TRACE_TO(index) \
371 TRANTOR_IF_(trantor::Logger::logLevel() <= trantor::Logger::kTrace) \
372 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kTrace, __func__) \
379 TRANTOR_IF_(trantor::Logger::logLevel() <= trantor::Logger::kDebug) \
380 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kDebug, __func__) \
382#define LOG_DEBUG_TO(index) \
383 TRANTOR_IF_(trantor::Logger::logLevel() <= trantor::Logger::kDebug) \
384 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kDebug, __func__) \
388 TRANTOR_IF_(trantor::Logger::logLevel() <= trantor::Logger::kInfo) \
389 trantor::Logger(__FILE__, __LINE__).stream()
390#define LOG_INFO_TO(index) \
391 TRANTOR_IF_(trantor::Logger::logLevel() <= trantor::Logger::kInfo) \
392 trantor::Logger(__FILE__, __LINE__).setIndex(index).stream()
394 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kWarn).stream()
395#define LOG_WARN_TO(index) \
396 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kWarn) \
400 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kError).stream()
401#define LOG_ERROR_TO(index) \
402 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kError) \
406 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kFatal).stream()
407#define LOG_FATAL_TO(index) \
408 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kFatal) \
411#define LOG_SYSERR trantor::Logger(__FILE__, __LINE__, true).stream()
412#define LOG_SYSERR_TO(index) \
413 trantor::Logger(__FILE__, __LINE__, true).setIndex(index).stream()
416#define LOG_COMPACT_DEBUG \
417 TRANTOR_IF_(trantor::Logger::logLevel() <= trantor::Logger::kDebug) \
418 trantor::Logger(trantor::Logger::kDebug).stream()
419#define LOG_COMPACT_DEBUG_TO(index) \
420 TRANTOR_IF_(trantor::Logger::logLevel() <= trantor::Logger::kDebug) \
421 trantor::Logger(trantor::Logger::kDebug).setIndex(index).stream()
422#define LOG_COMPACT_INFO \
423 TRANTOR_IF_(trantor::Logger::logLevel() <= trantor::Logger::kInfo) \
424 trantor::Logger().stream()
425#define LOG_COMPACT_INFO_TO(index) \
426 TRANTOR_IF_(trantor::Logger::logLevel() <= trantor::Logger::kInfo) \
427 trantor::Logger().setIndex(index).stream()
428#define LOG_COMPACT_WARN trantor::Logger(trantor::Logger::kWarn).stream()
429#define LOG_COMPACT_WARN_TO(index) \
430 trantor::Logger(trantor::Logger::kWarn).setIndex(index).stream()
431#define LOG_COMPACT_ERROR trantor::Logger(trantor::Logger::kError).stream()
432#define LOG_COMPACT_ERROR_TO(index) \
433 trantor::Logger(trantor::Logger::kError).setIndex(index).stream()
434#define LOG_COMPACT_FATAL trantor::Logger(trantor::Logger::kFatal).stream()
435#define LOG_COMPACT_FATAL_TO(index) \
436 trantor::Logger(trantor::Logger::kFatal).setIndex(index).stream()
437#define LOG_COMPACT_SYSERR trantor::Logger(true).stream()
438#define LOG_COMPACT_SYSERR_TO(index) \
439 trantor::Logger(true).setIndex(index).stream()
442#define LOG_RAW trantor::RawLogger().stream()
443#define LOG_RAW_TO(index) trantor::RawLogger().setIndex(index).stream()
445#define LOG_TRACE_IF(cond) \
446 TRANTOR_IF_((trantor::Logger::logLevel() <= trantor::Logger::kTrace) && \
448 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kTrace, __func__) \
450#define LOG_DEBUG_IF(cond) \
451 TRANTOR_IF_((trantor::Logger::logLevel() <= trantor::Logger::kDebug) && \
453 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kDebug, __func__) \
455#define LOG_INFO_IF(cond) \
456 TRANTOR_IF_((trantor::Logger::logLevel() <= trantor::Logger::kInfo) && \
458 trantor::Logger(__FILE__, __LINE__).stream()
459#define LOG_WARN_IF(cond) \
461 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kWarn).stream()
462#define LOG_ERROR_IF(cond) \
464 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kError).stream()
465#define LOG_FATAL_IF(cond) \
467 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kFatal).stream()
472 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kTrace, __func__) \
476 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kDebug, __func__) \
480 trantor::Logger(__FILE__, __LINE__).stream()
483 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kWarn).stream()
486 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kError).stream()
489 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kFatal).stream()
491#define DLOG_TRACE_IF(cond) \
493 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kTrace, __func__) \
495#define DLOG_DEBUG_IF(cond) \
497 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kDebug, __func__) \
499#define DLOG_INFO_IF(cond) \
501 trantor::Logger(__FILE__, __LINE__).stream()
502#define DLOG_WARN_IF(cond) \
504 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kWarn).stream()
505#define DLOG_ERROR_IF(cond) \
507 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kError).stream()
508#define DLOG_FATAL_IF(cond) \
510 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kFatal).stream()
513 TRANTOR_IF_(trantor::Logger::logLevel() <= trantor::Logger::kTrace) \
514 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kTrace, __func__) \
517 TRANTOR_IF_(trantor::Logger::logLevel() <= trantor::Logger::kDebug) \
518 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kDebug, __func__) \
521 TRANTOR_IF_(trantor::Logger::logLevel() <= trantor::Logger::kInfo) \
522 trantor::Logger(__FILE__, __LINE__).stream()
524 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kWarn).stream()
526 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kError).stream()
528 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kFatal).stream()
530#define DLOG_TRACE_IF(cond) \
531 TRANTOR_IF_((trantor::Logger::logLevel() <= trantor::Logger::kTrace) && \
533 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kTrace, __func__) \
535#define DLOG_DEBUG_IF(cond) \
536 TRANTOR_IF_((trantor::Logger::logLevel() <= trantor::Logger::kDebug) && \
538 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kDebug, __func__) \
540#define DLOG_INFO_IF(cond) \
541 TRANTOR_IF_((trantor::Logger::logLevel() <= trantor::Logger::kInfo) && \
543 trantor::Logger(__FILE__, __LINE__).stream()
544#define DLOG_WARN_IF(cond) \
546 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kWarn).stream()
547#define DLOG_ERROR_IF(cond) \
549 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kError).stream()
550#define DLOG_FATAL_IF(cond) \
552 trantor::Logger(__FILE__, __LINE__, trantor::Logger::kFatal).stream()
555const char *strerror_tl(
int savedErrno);
Definition LogStream.h:120
Calculate of basename of source files in compile time.
Definition Logger.h:58
static void setOutputFunction(std::function< void(const char *msg, const uint64_t len)> outputFunc, std::function< void()> flushFunc, int index=-1)
Set the output function.
Definition Logger.h:124
static void enableSpdLog(int index, std::shared_ptr< spdlog::logger > logger={})
Enable logging with spdlog for the specified channel.
static bool hasSpdLogSupport()
Check whether trantor was build with spdlog support.
static void setLogLevel(LogLevel level)
Set the log level. Logs below the level are not printed.
Definition Logger.h:146
static void disableSpdLog()
Disable logging with spdlog for the default channel.
Definition Logger.h:220
static bool displayLocalTime()
Check whether it shows local time or UTC time.
Definition Logger.h:164
static std::shared_ptr< spdlog::logger > getDefaultSpdLogger(int index)
Get a default spdlog::logger for the specified channel.
static void setDisplayLocalTime(bool showLocalTime)
Set whether it shows local time or UTC time. the default is UTC.
Definition Logger.h:172
static std::shared_ptr< spdlog::logger > getSpdLogger(int index=-1)
Get the spdlog::logger set on the specified channel.
static LogLevel logLevel()
Get the current log level.
Definition Logger.h:156
static void enableSpdLog(std::shared_ptr< spdlog::logger > logger={})
Enable logging with spdlog for the default channel.
Definition Logger.h:201
static void disableSpdLog(int index)
Disable logging with spdlog for the specified channel.
Definition EventLoop.h:34