17#ifndef EASYLOGGINGPP_H
18#define EASYLOGGINGPP_H
21#if __cplusplus >= 201103L
24#if (defined(__GNUC__))
25# define ELPP_COMPILER_GCC 1
27# define ELPP_COMPILER_GCC 0
30# define ELPP_GCC_VERSION (__GNUC__ * 10000 \
31+ __GNUC_MINOR__ * 100 \
33# if defined(__GXX_EXPERIMENTAL_CXX0X__)
39# define ELPP_COMPILER_MSVC 1
41# define ELPP_COMPILER_MSVC 0
43#define ELPP_CRT_DBG_WARNINGS ELPP_COMPILER_MSVC
45# if (_MSC_VER == 1600)
47# elif(_MSC_VER >= 1700)
52#if (defined(__clang__) && (__clang__ == 1))
53# define ELPP_COMPILER_CLANG 1
55# define ELPP_COMPILER_CLANG 0
57#if ELPP_COMPILER_CLANG
58# if __has_include(<thread>)
60# if !defined(__GLIBCXX__) || __GLIBCXX__ >= 20150426
61# define ELPP_CLANG_SUPPORTS_THREAD
65#if (defined(__MINGW32__) || defined(__MINGW64__))
70#if (defined(__CYGWIN__) && (__CYGWIN__ == 1))
75#if (defined(__INTEL_COMPILER))
76# define ELPP_COMPILER_INTEL 1
78# define ELPP_COMPILER_INTEL 0
82#if (defined(_WIN32) || defined(_WIN64))
83# define ELPP_OS_WINDOWS 1
85# define ELPP_OS_WINDOWS 0
88#if (defined(__linux) || defined(__linux__))
89# define ELPP_OS_LINUX 1
91# define ELPP_OS_LINUX 0
93#if (defined(__APPLE__))
98#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__))
99# define ELPP_OS_FREEBSD 1
101# define ELPP_OS_FREEBSD 0
103#if (defined(__OpenBSD__))
104# define ELPP_OS_OPENBSD 1
106# define ELPP_OS_OPENBSD 0
108#if (defined(__NetBSD__))
109# define ELPP_OS_NETBSD 1
111# define ELPP_OS_NETBSD 0
114# define ELPP_OS_SOLARIS 1
116# define ELPP_OS_SOLARIS 0
119# define ELPP_OS_AIX 1
121# define ELPP_OS_AIX 0
123#if (defined(__NetBSD__))
124# define ELPP_OS_NETBSD 1
126# define ELPP_OS_NETBSD 0
128#if defined(__EMSCRIPTEN__)
129# define ELPP_OS_EMSCRIPTEN 1
131# define ELPP_OS_EMSCRIPTEN 0
133#if (defined(__DragonFly__))
134# define ELPP_OS_DRAGONFLY 1
136# define ELPP_OS_DRAGONFLY 0
139#if ((ELPP_OS_LINUX || ELPP_OS_MAC || ELPP_OS_FREEBSD || ELPP_OS_NETBSD || ELPP_OS_SOLARIS || ELPP_OS_AIX || ELPP_OS_EMSCRIPTEN || ELPP_OS_DRAGONFLY || ELPP_OS_OPENBSD) && (!ELPP_OS_WINDOWS))
140# define ELPP_OS_UNIX 1
142# define ELPP_OS_UNIX 0
144#if (defined(__ANDROID__))
145# define ELPP_OS_ANDROID 1
147# define ELPP_OS_ANDROID 0
150#if !ELPP_OS_UNIX && !ELPP_OS_WINDOWS && ELPP_CYGWIN
153# define ELPP_OS_UNIX 1
154# define ELPP_OS_LINUX 1
156#if !defined(ELPP_INTERNAL_DEBUGGING_OUT_INFO)
157# define ELPP_INTERNAL_DEBUGGING_OUT_INFO std::cout
159#if !defined(ELPP_INTERNAL_DEBUGGING_OUT_ERROR)
160# define ELPP_INTERNAL_DEBUGGING_OUT_ERROR std::cerr
162#if !defined(ELPP_INTERNAL_DEBUGGING_ENDL)
163# define ELPP_INTERNAL_DEBUGGING_ENDL std::endl
165#if !defined(ELPP_INTERNAL_DEBUGGING_MSG)
166# define ELPP_INTERNAL_DEBUGGING_MSG(msg) msg
169#if !defined(ELPP_DISABLE_ASSERT)
170# if (defined(ELPP_DEBUG_ASSERT_FAILURE))
171# define ELPP_ASSERT(expr, msg) if (!(expr)) { \
172std::stringstream internalInfoStream; internalInfoStream << msg; \
173ELPP_INTERNAL_DEBUGGING_OUT_ERROR \
174<< "EASYLOGGING++ ASSERTION FAILED (LINE: " << __LINE__ << ") [" #expr << "] WITH MESSAGE \"" \
175<< ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) << "\"" << ELPP_INTERNAL_DEBUGGING_ENDL; base::utils::abort(1, \
176"ELPP Assertion failure, please define ELPP_DEBUG_ASSERT_FAILURE"); }
178# define ELPP_ASSERT(expr, msg) if (!(expr)) { \
179std::stringstream internalInfoStream; internalInfoStream << msg; \
180ELPP_INTERNAL_DEBUGGING_OUT_ERROR\
181<< "ASSERTION FAILURE FROM EASYLOGGING++ (LINE: " \
182<< __LINE__ << ") [" #expr << "] WITH MESSAGE \"" << ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) << "\"" \
183<< ELPP_INTERNAL_DEBUGGING_ENDL; }
186# define ELPP_ASSERT(x, y)
188#if ELPP_COMPILER_MSVC
189# define ELPP_INTERNAL_DEBUGGING_WRITE_PERROR \
190{ char buff[256]; strerror_s(buff, 256, errno); \
191ELPP_INTERNAL_DEBUGGING_OUT_ERROR << ": " << buff << " [" << errno << "]";} (void)0
193# define ELPP_INTERNAL_DEBUGGING_WRITE_PERROR \
194ELPP_INTERNAL_DEBUGGING_OUT_ERROR << ": " << strerror(errno) << " [" << errno << "]"; (void)0
196#if defined(ELPP_DEBUG_ERRORS)
197# if !defined(ELPP_INTERNAL_ERROR)
198# define ELPP_INTERNAL_ERROR(msg, pe) { \
199std::stringstream internalInfoStream; internalInfoStream << "<ERROR> " << msg; \
200ELPP_INTERNAL_DEBUGGING_OUT_ERROR \
201<< "ERROR FROM EASYLOGGING++ (LINE: " << __LINE__ << ") " \
202<< ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) << ELPP_INTERNAL_DEBUGGING_ENDL; \
203if (pe) { ELPP_INTERNAL_DEBUGGING_OUT_ERROR << " "; ELPP_INTERNAL_DEBUGGING_WRITE_PERROR; }} (void)0
206# undef ELPP_INTERNAL_INFO
207# define ELPP_INTERNAL_ERROR(msg, pe)
209#if (defined(ELPP_DEBUG_INFO))
210# if !(defined(ELPP_INTERNAL_INFO_LEVEL))
211# define ELPP_INTERNAL_INFO_LEVEL 9
213# if !defined(ELPP_INTERNAL_INFO)
214# define ELPP_INTERNAL_INFO(lvl, msg) { if (lvl <= ELPP_INTERNAL_INFO_LEVEL) { \
215std::stringstream internalInfoStream; internalInfoStream << "<INFO> " << msg; \
216ELPP_INTERNAL_DEBUGGING_OUT_INFO << ELPP_INTERNAL_DEBUGGING_MSG(internalInfoStream.str()) \
217<< ELPP_INTERNAL_DEBUGGING_ENDL; }}
220# undef ELPP_INTERNAL_INFO
221# define ELPP_INTERNAL_INFO(lvl, msg)
223#if (defined(ELPP_FEATURE_ALL)) || (defined(ELPP_FEATURE_CRASH_LOG))
224# if (ELPP_COMPILER_GCC && !ELPP_MINGW && !ELPP_OS_OPENBSD && !ELPP_OS_NETBSD && !ELPP_OS_ANDROID && !ELPP_OS_EMSCRIPTEN)
225# define ELPP_STACKTRACE 1
227# define ELPP_STACKTRACE 0
228# ifdef EASYLOGGING_CC
229# if ELPP_COMPILER_MSVC
230# pragma message("Stack trace not available for this compiler")
232# warning "Stack trace not available for this compiler";
237# define ELPP_STACKTRACE 0
240#define ELPP_UNUSED(x) (void)x
243# define ELPP_LOG_PERMS S_IRUSR | S_IWUSR | S_IXUSR | S_IWGRP | S_IRGRP | S_IXGRP | S_IWOTH | S_IXOTH
245#if defined(ELPP_AS_DLL) && ELPP_COMPILER_MSVC
246# if defined(ELPP_EXPORT_SYMBOLS)
247# define ELPP_EXPORT __declspec(dllexport)
249# define ELPP_EXPORT __declspec(dllimport)
259#if ELPP_CRT_DBG_WARNINGS
260# define STRTOK(a, b, c) strtok_s(a, b, c)
261# define STRERROR(a, b, c) strerror_s(a, b, c)
262# define STRCAT(a, b, len) strcat_s(a, len, b)
263# define STRCPY(a, b, len) strcpy_s(a, len, b)
265# define STRTOK(a, b, c) strtok(a, b)
266# define STRERROR(a, b, c) strerror(c)
267# define STRCAT(a, b, len) strcat(a, b)
268# define STRCPY(a, b, len) strcpy(a, b)
271#if (ELPP_MINGW && !defined(ELPP_FORCE_USE_STD_THREAD))
272# define ELPP_USE_STD_THREADING 0
274# if ((ELPP_COMPILER_CLANG && defined(ELPP_CLANG_SUPPORTS_THREAD)) || \
275 (!ELPP_COMPILER_CLANG && defined(ELPP_CXX11)) || \
276 defined(ELPP_FORCE_USE_STD_THREAD))
277# define ELPP_USE_STD_THREADING 1
279# define ELPP_USE_STD_THREADING 0
283#if ELPP_COMPILER_INTEL || (ELPP_GCC_VERSION < 40702)
286# define ELPP_FINAL final
288#if defined(ELPP_EXPERIMENTAL_ASYNC)
289# define ELPP_ASYNC_LOGGING 1
291# define ELPP_ASYNC_LOGGING 0
293#if defined(ELPP_THREAD_SAFE) || ELPP_ASYNC_LOGGING
294# define ELPP_THREADING_ENABLED 1
296# define ELPP_THREADING_ENABLED 0
300#if ELPP_COMPILER_MSVC
301# define ELPP_FUNC __FUNCSIG__
302#elif ELPP_COMPILER_GCC
303# define ELPP_FUNC __PRETTY_FUNCTION__
304#elif ELPP_COMPILER_INTEL
305# define ELPP_FUNC __PRETTY_FUNCTION__
306#elif ELPP_COMPILER_CLANG
307# define ELPP_FUNC __PRETTY_FUNCTION__
309# if defined(__func__)
310# define ELPP_FUNC __func__
315#undef ELPP_VARIADIC_TEMPLATES_SUPPORTED
317#define ELPP_VARIADIC_TEMPLATES_SUPPORTED \
318(ELPP_COMPILER_GCC || ELPP_COMPILER_CLANG || ELPP_COMPILER_INTEL || (ELPP_COMPILER_MSVC && _MSC_VER >= 1800))
320#ifdef ELPP_DISABLE_LOGS
321# define ELPP_LOGGING_ENABLED 0
323# define ELPP_LOGGING_ENABLED 1
325#if (!defined(ELPP_DISABLE_DEBUG_LOGS) && (ELPP_LOGGING_ENABLED))
326# define ELPP_DEBUG_LOG 1
328# define ELPP_DEBUG_LOG 0
330#if (!defined(ELPP_DISABLE_INFO_LOGS) && (ELPP_LOGGING_ENABLED))
331# define ELPP_INFO_LOG 1
333# define ELPP_INFO_LOG 0
335#if (!defined(ELPP_DISABLE_WARNING_LOGS) && (ELPP_LOGGING_ENABLED))
336# define ELPP_WARNING_LOG 1
338# define ELPP_WARNING_LOG 0
340#if (!defined(ELPP_DISABLE_ERROR_LOGS) && (ELPP_LOGGING_ENABLED))
341# define ELPP_ERROR_LOG 1
343# define ELPP_ERROR_LOG 0
345#if (!defined(ELPP_DISABLE_FATAL_LOGS) && (ELPP_LOGGING_ENABLED))
346# define ELPP_FATAL_LOG 1
348# define ELPP_FATAL_LOG 0
350#if (!defined(ELPP_DISABLE_TRACE_LOGS) && (ELPP_LOGGING_ENABLED))
351# define ELPP_TRACE_LOG 1
353# define ELPP_TRACE_LOG 0
355#if (!defined(ELPP_DISABLE_VERBOSE_LOGS) && (ELPP_LOGGING_ENABLED))
356# define ELPP_VERBOSE_LOG 1
358# define ELPP_VERBOSE_LOG 0
360#if (!(ELPP_CXX0X || ELPP_CXX11))
361# error "C++0x (or higher) support not detected! (Is `-std=c++11' missing?)"
364#if defined(ELPP_SYSLOG)
376#if defined(ELPP_UNICODE)
384# include <execinfo.h>
387# include <sys/system_properties.h>
390# include <sys/stat.h>
391# include <sys/time.h>
395# if defined(WIN32_LEAN_AND_MEAN)
396# if defined(ELPP_WINSOCK2)
397# include <winsock2.h>
406#include <unordered_map>
414#include <type_traits>
415#if ELPP_THREADING_ENABLED
416# if ELPP_USE_STD_THREADING
425#if ELPP_ASYNC_LOGGING
426# if defined(ELPP_NO_SLEEP_FOR)
431# include <condition_variable>
433#if defined(ELPP_STL_LOGGING)
441# if defined(ELPP_LOG_STD_ARRAY)
444# if defined(ELPP_LOG_UNORDERED_SET)
445# include <unordered_set>
448#if defined(ELPP_QT_LOGGING)
451# include <QByteArray>
458# include <QLinkedList>
460# include <QMultiHash>
463#if defined(ELPP_BOOST_LOGGING)
465# include <boost/container/vector.hpp>
466# include <boost/container/stable_vector.hpp>
467# include <boost/container/list.hpp>
468# include <boost/container/deque.hpp>
469# include <boost/container/map.hpp>
470# include <boost/container/flat_map.hpp>
471# include <boost/container/set.hpp>
472# include <boost/container/flat_set.hpp>
474#if defined(ELPP_WXWIDGETS_LOGGING)
476# include <wx/vector.h>
478#if defined(ELPP_UTC_DATETIME)
479# define elpptime_r gmtime_r
480# define elpptime_s gmtime_s
481# define elpptime gmtime
483# define elpptime_r localtime_r
484# define elpptime_s localtime_s
485# define elpptime localtime
491class PerformanceTrackingData;
494template <
typename T>
class Callback;
495class LogDispatchCallback;
496class PerformanceTrackingCallback;
497class LoggerRegistrationCallback;
498class LogDispatchData;
501class RegisteredLoggers;
502class PerformanceTracker;
507class DefaultLogBuilder;
508class DefaultLogDispatchCallback;
509#if ELPP_ASYNC_LOGGING
510class AsyncLogDispatchCallback;
511class AsyncDispatchWorker;
513class DefaultPerformanceTrackingCallback;
525#if defined(ELPP_UNICODE)
526# define ELPP_LITERAL(txt) L##txt
527# define ELPP_STRLEN wcslen
528# if defined ELPP_CUSTOM_COUT
529# define ELPP_COUT ELPP_CUSTOM_COUT
531# define ELPP_COUT std::wcout
539# define ELPP_LITERAL(txt) txt
540# define ELPP_STRLEN strlen
541# if defined ELPP_CUSTOM_COUT
542# define ELPP_COUT ELPP_CUSTOM_COUT
544# define ELPP_COUT std::cout
552#if defined(ELPP_CUSTOM_COUT_LINE)
553# define ELPP_COUT_LINE(logLine) ELPP_CUSTOM_COUT_LINE(logLine)
555# define ELPP_COUT_LINE(logLine) logLine << std::flush
622template<>
struct hash<
el::Level> {
643 return static_cast<Level>(l);
769#ifdef ELPP_DEFAULT_LOGGER
775#if defined(ELPP_FEATURE_ALL) || defined(ELPP_FEATURE_PERFORMANCE_TRACKING)
776#ifdef ELPP_DEFAULT_PERFORMANCE_LOGGER
777static const char* kPerformanceLoggerId = ELPP_DEFAULT_PERFORMANCE_LOGGER;
779static const char* kPerformanceLoggerId =
"performance";
783#if defined(ELPP_SYSLOG)
784static const char* kSysLogLoggerId =
"syslog";
816 SIGABRT,
"SIGABRT",
"Abnormal termination",
817 "Program was abnormally terminated."
820 SIGFPE,
"SIGFPE",
"Erroneous arithmetic operation",
821 "Arithemetic operation issue such as division by zero or operation resulting in overflow."
824 SIGILL,
"SIGILL",
"Illegal instruction",
825 "Generally due to a corruption in the code or to an attempt to execute data."
828 SIGSEGV,
"SIGSEGV",
"Invalid access to memory",
829 "Program is trying to read an invalid (unallocated, deleted or corrupted) or inaccessible memory."
832 SIGINT,
"SIGINT",
"Interactive attention signal",
833 "Interruption generated (generally) by user or operating system."
857 VerboseLevel = 1 << 10,
879 void init(
int width);
888typename std::enable_if<std::is_pointer<T*>::value,
void>
::type
898template <
typename Enum>
902template <
typename Enum>
906template <
typename Enum>
911template <
typename Enum>
915template <
typename Enum>
919template <
typename Enum>
925#if ELPP_THREADING_ENABLED
926# if !ELPP_USE_STD_THREADING
933 pthread_mutexattr_t attr;
934 pthread_mutexattr_init(&attr);
935 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
936 pthread_mutex_init(&m_underlyingMutex, &attr);
937 pthread_mutexattr_destroy(&attr);
938# elif ELPP_OS_WINDOWS
939 InitializeCriticalSection(&m_underlyingMutex);
943 virtual ~Mutex(
void) {
945 pthread_mutex_destroy(&m_underlyingMutex);
946# elif ELPP_OS_WINDOWS
947 DeleteCriticalSection(&m_underlyingMutex);
951 inline void lock(
void) {
953 pthread_mutex_lock(&m_underlyingMutex);
954# elif ELPP_OS_WINDOWS
955 EnterCriticalSection(&m_underlyingMutex);
961 return (pthread_mutex_trylock(&m_underlyingMutex) == 0);
962# elif ELPP_OS_WINDOWS
963 return TryEnterCriticalSection(&m_underlyingMutex);
967 inline void unlock(
void) {
969 pthread_mutex_unlock(&m_underlyingMutex);
970# elif ELPP_OS_WINDOWS
971 LeaveCriticalSection(&m_underlyingMutex);
977 pthread_mutex_t m_underlyingMutex;
978# elif ELPP_OS_WINDOWS
979 CRITICAL_SECTION m_underlyingMutex;
991 virtual ~ScopedLock(
void) {
999typedef base::threading::internal::Mutex
Mutex;
1000typedef base::threading::internal::ScopedLock<base::threading::Mutex>
ScopedLock;
1002typedef std::recursive_mutex
Mutex;
1003typedef std::lock_guard<base::threading::Mutex>
ScopedLock;
1018template <
typename Mutex>
1045#if ELPP_THREADING_ENABLED
1046# if !ELPP_USE_STD_THREADING
1049 std::stringstream ss;
1050# if (ELPP_OS_WINDOWS)
1051 ss << GetCurrentThreadId();
1057static std::string getCurrentThreadId(
void) {
1058 std::stringstream ss;
1059 char prev_fill = ss.fill(
' ');
1060 auto prev_flags = ss.flags(std::ios::hex);
1062 auto prev_width = ss.width(16);
1063 ss << std::this_thread::get_id();
1065 ss.flags(prev_flags);
1066 ss.width(prev_width);
1072 return std::string();
1087 static bool pathExists(
const char* path,
bool considerFile =
false);
1091 static bool createPath(
const std::string& path);
1096 static void buildStrippedFilename(
const char* filename,
char buff[],
const std::string &commonPrefix = NULL,
1108 return c >=
'0' && c <=
'9';
1112 static bool wildCardMatch(
const char* str,
const char* pattern);
1114 static std::string& ltrim(std::string& str);
1115 static std::string& rtrim(std::string& str);
1116 static std::string& trim(std::string& str);
1122 static bool startsWith(
const std::string& str,
const std::string&
start);
1128 static bool endsWith(
const std::string& str,
const std::string& end);
1135 static std::string& replaceAll(std::string& str,
char replaceWhat,
char replaceWith);
1142 static std::string& replaceAll(std::string& str,
const std::string& replaceWhat,
1143 const std::string& replaceWith);
1147#if defined(ELPP_UNICODE)
1149 const std::string& replaceWith);
1154 static std::string& toUpper(std::string& str);
1157 static bool cStringEq(
const char* s1,
const char* s2);
1161 static bool cStringCaseEq(
const char* s1,
const char* s2);
1164 static bool contains(
const char* str,
char c);
1166 static char* convertAndAddToBuff(std::size_t n,
int len,
char* buf,
const char* bufLim,
bool zeroPadded =
true);
1167 static char* addToBuff(
const char* str,
char* buf,
const char* bufLim);
1168 static char* clearBuff(
char buff[], std::size_t lim);
1172 static char* wcharPtrToCharPtr(
const wchar_t* line);
1182 static const char* getWindowsEnvironmentVariable(
const char* varname);
1186 static std::string getProperty(
const char* prop);
1189 static std::string getDeviceName(
void);
1197 static const std::string
getBashOutput(
const char* command);
1205 const char* alternativeBashCommand =
nullptr);
1234 static std::string
timevalToString(
struct timeval tval,
const char* format,
1241 static unsigned long long getTimeDifference(
const struct timeval& endTime,
const struct timeval& startTime,
1245 static struct ::tm*
buildTimeInfo(
struct timeval* currTime, struct ::tm* timeInfo);
1247 static char*
parseFormat(
char* buf, std::size_t bufSz,
const char* format,
const struct tm* tInfo,
1254 setArgs(0,
static_cast<char**
>(
nullptr));
1264 inline void setArgs(
int argc,
const char** argv) {
1265 setArgs(argc,
const_cast<char**
>(argv));
1268 void setArgs(
int argc,
char** argv);
1270 bool hasParamWithValue(
const char* paramKey)
const;
1273 const char* getParamValue(
const char* paramKey)
const;
1275 bool hasParam(
const char* paramKey)
const;
1277 bool empty(
void)
const;
1279 std::size_t size(
void)
const;
1294template <
typename T_Ptr,
typename Container>
1309 m_list = std::move(sr.m_list);
1316 for (std::size_t i = 0; i <
m_list.size(); ++i) {
1328 for (std::size_t i = 0; i <
m_list.size(); ++i) {
1342 m_list = std::move(sr.m_list);
1409template <
typename T_Ptr,
typename T_Key = const
char*>
1442 if (!this->
empty()) {
1443 for (
auto&& curr : this->
list()) {
1446 this->
list().clear();
1453 this->
list().insert(std::make_pair(uniqKey, ptr));
1458 T_Ptr* existing =
get(uniqKey);
1459 if (existing !=
nullptr) {
1460 this->
list().erase(uniqKey);
1466 T_Ptr*
get(
const T_Key& uniqKey) {
1468 return it == this->
list().end()
1485template <
typename T_Ptr,
typename Pred>
1526 if (!this->
empty()) {
1527 for (
auto&& curr : this->
list()) {
1530 this->
list().clear();
1537 for (; iter != this->
end(); ++iter) {
1542 if (iter != this->
end() && *iter !=
nullptr) {
1543 this->
list().erase(iter);
1550 this->
list().push_back(ptr);
1555 template <
typename T,
typename T2>
1556 T_Ptr*
get(
const T& arg1,
const T2 arg2) {
1558 if (iter != this->
list().
end() && *iter !=
nullptr) {
1566 for (
const_iterator it = sr.list().begin(); it != sr.list().end(); ++it) {
1573 template <
typename T,
typename TPtr>
1574 static bool installCallback(
const std::string&
id, std::unordered_map<std::string, TPtr>* mapT) {
1575 if (mapT->find(
id) == mapT->end()) {
1576 mapT->insert(std::make_pair(
id, TPtr(
new T())));
1582 template <
typename T,
typename TPtr>
1584 if (mapT->find(
id) != mapT->end()) {
1589 template <
typename T,
typename TPtr>
1590 static T*
callback(
const std::string&
id, std::unordered_map<std::string, TPtr>* mapT) {
1591 typename std::unordered_map<std::string, TPtr>::iterator iter = mapT->find(
id);
1592 if (iter != mapT->end()) {
1593 return static_cast<T*
>(iter->second.get());
1664 virtual void updateFormatSpec(
void)
ELPP_FINAL;
1735 inline const std::string&
value(
void)
const {
1792 bool parseFromFile(
const std::string& configurationFile,
Configurations*
base =
nullptr);
1802 bool parseFromText(
const std::string& configurationsString,
Configurations*
base =
nullptr);
1864 void setToDefault(
void);
1873 void setRemainingToDefault(
void);
1907 static bool isLevel(
const std::string& line);
1908 static bool isComment(
const std::string& line);
1909 static inline bool isConfig(
const std::string& line);
1910 static bool parseLine(std::string* line, std::string* currConfigStr, std::string* currLevelStr,
Level* currLevel,
1959 bool enabled(
Level level);
1960 bool toFile(
Level level);
1961 const std::string& filename(
Level level);
1962 bool toStandardOutput(
Level level);
1968 std::size_t maxLogFileSize(
Level level);
1969 std::size_t logFlushThreshold(
Level level);
1991 template <
typename Conf_T>
1992 inline Conf_T
getConfigByVal(
Level level,
const std::unordered_map<Level, Conf_T>* confMap,
const char* confName) {
1997 template <
typename Conf_T>
1998 inline Conf_T&
getConfigByRef(
Level level, std::unordered_map<Level, Conf_T>* confMap,
const char* confName) {
2003 template <
typename Conf_T>
2006 typename std::unordered_map<Level, Conf_T>::const_iterator it = confMap->find(level);
2007 if (it == confMap->end()) {
2013 << std::endl <<
"Please ensure you have properly configured logger.",
false);
2020 template <
typename Conf_T>
2023 typename std::unordered_map<Level, Conf_T>::iterator it = confMap->find(level);
2024 if (it == confMap->end()) {
2030 << std::endl <<
"Please ensure you have properly configured logger.",
false);
2037 template <
typename Conf_T>
2039 bool includeGlobalLevel =
true) {
2041 if (confMap->empty() && includeGlobalLevel) {
2046 typename std::unordered_map<Level, Conf_T>::iterator it = confMap->find(
Level::Global);
2047 if (it != confMap->end() && it->second ==
value) {
2051 it = confMap->find(level);
2052 if (it == confMap->end()) {
2054 confMap->insert(std::make_pair(level,
value));
2057 confMap->at(level) =
value;
2062 unsigned long getULong(std::string confVal);
2063 std::string resolveFilename(
const std::string& filename);
2064 void insertFile(
Level level,
const std::string& fullFilename);
2094 if (&hitCounter !=
this) {
2142 return ((counter !=
nullptr) &&
2175 return get(filename, lineNumber);
2183template <
typename T>
2226 std::unordered_map<std::string, std::unique_ptr<base::threading::Mutex>>
m_fileLocks;
2231 friend class base::PerformanceTracker;
2273 void reconfigure(
void);
2275 inline const std::string&
id(
void)
const {
2295 static bool isValidId(
const std::string&
id);
2318#if ELPP_VARIADIC_TEMPLATES_SUPPORTED
2319# define LOGGER_LEVEL_WRITERS_SIGNATURES(FUNCTION_NAME)\
2320template <typename T, typename... Args>\
2321inline void FUNCTION_NAME(const char*, const T&, const Args&...);\
2322template <typename T>\
2323inline void FUNCTION_NAME(const T&);
2325 template <
typename T,
typename... Args>
2326 inline void verbose(
int,
const char*,
const T&,
const Args&...);
2328 template <
typename T>
2329 inline void verbose(
int,
const T&);
2331 LOGGER_LEVEL_WRITERS_SIGNATURES(
info)
2332 LOGGER_LEVEL_WRITERS_SIGNATURES(debug)
2333 LOGGER_LEVEL_WRITERS_SIGNATURES(warn)
2334 LOGGER_LEVEL_WRITERS_SIGNATURES(error)
2335 LOGGER_LEVEL_WRITERS_SIGNATURES(fatal)
2336 LOGGER_LEVEL_WRITERS_SIGNATURES(trace)
2337# undef LOGGER_LEVEL_WRITERS_SIGNATURES
2359 friend class el::base::PerformanceTracker;
2364#if ELPP_VARIADIC_TEMPLATES_SUPPORTED
2365 template <
typename T,
typename... Args>
2366 void log_(
Level,
int,
const char*,
const T&,
const Args&...);
2368 template <
typename T>
2369 inline void log_(
Level,
int,
const T&);
2371 template <
typename T,
typename... Args>
2372 void log(
Level,
const char*,
const T&,
const Args&...);
2374 template <
typename T>
2384 void resolveLoggerFormatSpec(
void)
const;
2405 Logger*
get(
const std::string&
id,
bool forceCreation =
true);
2407 template <
typename T>
2413 template <
typename T>
2418 template <
typename T>
2423 bool remove(
const std::string&
id);
2425 inline bool has(
const std::string&
id) {
2426 return get(
id,
false) !=
nullptr;
2469 void clearCategories(
void);
2476 void setCategories(
const char* categories,
bool clear =
true);
2478 std::string getCategories();
2480 void setModules(
const char* modules);
2482 bool priority_allowed(
int priority,
const std::string &category);
2483 bool allowed(
Level level,
const std::string &category);
2487 inline const std::unordered_map<std::string, base::type::VerboseLevel>&
modules(
void)
const {
2509 std::unordered_map<std::string, base::type::VerboseLevel>
m_modules;
2529 inline const std::string&
file(
void)
const {
2535 inline const std::string&
func(
void)
const {
2558#if ELPP_ASYNC_LOGGING
2562 : m_logMessage(logMessage), m_dispatchData(
data), m_logLine(logLine) {}
2563 virtual ~AsyncLogItem() {}
2565 return &m_logMessage;
2568 return &m_dispatchData;
2578class AsyncLogQueue :
public base::threading::ThreadSafe {
2580 virtual ~AsyncLogQueue() {
2584 inline AsyncLogItem
next(
void) {
2585 base::threading::ScopedLock scopedLock(lock());
2586 AsyncLogItem
result = m_queue.front();
2591 inline void push(
const AsyncLogItem& item) {
2592 base::threading::ScopedLock scopedLock(lock());
2595 inline void pop(
void) {
2596 base::threading::ScopedLock scopedLock(lock());
2599 inline AsyncLogItem front(
void) {
2600 base::threading::ScopedLock scopedLock(lock());
2601 return m_queue.front();
2603 inline bool empty(
void) {
2604 base::threading::ScopedLock scopedLock(lock());
2605 return m_queue.empty();
2608 std::queue<AsyncLogItem> m_queue;
2612 virtual ~IWorker() {}
2613 virtual void start() = 0;
2617class Storage : base::NoCopy, public base::threading::ThreadSafe {
2619#if ELPP_ASYNC_LOGGING
2628 return hitCounters()->validateEveryN(filename, lineNumber, occasion);
2632 return hitCounters()->validateAfterN(filename, lineNumber, n);
2636 return hitCounters()->validateNTimes(filename, lineNumber, n);
2651#if ELPP_ASYNC_LOGGING
2652 inline base::AsyncLogQueue* asyncLogQueue(
void)
const {
2653 return m_asyncLogQueue;
2693 bool hasCustomFormatSpecifier(
const char* formatSpecifier);
2695 bool uninstallCustomFormatSpecifier(
const char* formatSpecifier);
2709 template <
typename T>
2714 template <
typename T>
2718 template <
typename T>
2723#if defined(ELPP_FEATURE_ALL) || defined(ELPP_FEATURE_PERFORMANCE_TRACKING)
2724 template <
typename T>
2725 inline bool installPerformanceTrackingCallback(
const std::string&
id) {
2727 &m_performanceTrackingCallbacks);
2730 template <
typename T>
2731 inline void uninstallPerformanceTrackingCallback(
const std::string&
id) {
2733 &m_performanceTrackingCallbacks);
2736 template <
typename T>
2737 inline T* performanceTrackingCallback(
const std::string&
id) {
2738 return base::utils::Utils::callback<T, base::type::PerformanceTrackingCallbackPtr>(
id, &m_performanceTrackingCallbacks);
2744 if (name.empty())
return;
2751 std::unordered_map<std::string, std::string>::const_iterator it =
m_threadNames.find(threadId);
2765#if ELPP_ASYNC_LOGGING
2766 base::AsyncLogQueue* m_asyncLogQueue;
2767 base::IWorker* m_asyncDispatchWorker;
2784 friend class el::base::PerformanceTracker;
2795#define ELPP el::base::Storage::getELPP()
2803#if ELPP_ASYNC_LOGGING
2810 AsyncDispatchWorker();
2811 virtual ~AsyncDispatchWorker();
2814 void emptyQueue(
void);
2815 virtual void start(
void);
2816 void handle(AsyncLogItem* logItem);
2819 void setContinueRunning(
bool value) {
2821 m_continueRunning =
value;
2824 bool continueRunning(
void)
const {
2825 return m_continueRunning;
2828 std::condition_variable cv;
2829 bool m_continueRunning;
2830 base::threading::Mutex m_continueRunningLock;
2848 void dispatch(
void);
2855#if defined(ELPP_STL_LOGGING)
2862namespace workarounds {
2864template <
typename T,
typename Container>
2865class IterableContainer {
2867 typedef typename Container::iterator iterator;
2868 typedef typename Container::const_iterator const_iterator;
2869 IterableContainer(
void) {}
2870 virtual ~IterableContainer(
void) {}
2871 iterator begin(
void) {
2872 return getContainer().begin();
2874 iterator end(
void) {
2875 return getContainer().end();
2878 virtual Container& getContainer(
void) = 0;
2881template<
typename T,
typename Container = std::vector<T>,
typename Comparator = std::less<
typename Container::value_type>>
2882class IterablePriorityQueue :
public IterableContainer<T, Container>,
2883 public std::priority_queue<T, Container, Comparator> {
2885 IterablePriorityQueue(std::priority_queue<T, Container, Comparator> queue_) {
2886 std::size_t count_ = 0;
2888 this->push(queue_.top());
2893 inline Container& getContainer(
void) {
2898template<
typename T,
typename Container = std::deque<T>>
2899class IterableQueue :
public IterableContainer<T, Container>,
public std::queue<T, Container> {
2901 IterableQueue(std::queue<T, Container> queue_) {
2902 std::size_t count_ = 0;
2903 while (++count_ < base::consts::kMaxLogPerContainer && !queue_.empty()) {
2904 this->push(queue_.front());
2909 inline Container& getContainer(
void) {
2914template<
typename T,
typename Container = std::deque<T>>
2915class IterableStack :
public IterableContainer<T, Container>,
public std::stack<T, Container> {
2917 IterableStack(std::stack<T, Container> stack_) {
2918 std::size_t count_ = 0;
2919 while (++count_ < base::consts::kMaxLogPerContainer && !stack_.empty()) {
2920 this->push(stack_.top());
2925 inline Container& getContainer(
void) {
2935 void initialize(
Logger* logger);
2937# define ELPP_SIMPLE_LOG(LOG_TYPE)\
2938MessageBuilder& operator<<(LOG_TYPE msg) {\
2939m_logger->stream() << msg;\
2940if (ELPP->hasFlag(LoggingFlag::AutoSpacing)) {\
2941m_logger->stream() << " ";\
2972#define ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(temp) \
2973template <typename T> \
2974inline MessageBuilder& operator<<(const temp<T>& template_inst) { \
2975return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \
2977#define ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(temp) \
2978template <typename T1, typename T2> \
2979inline MessageBuilder& operator<<(const temp<T1, T2>& template_inst) { \
2980return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \
2982#define ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(temp) \
2983template <typename T1, typename T2, typename T3> \
2984inline MessageBuilder& operator<<(const temp<T1, T2, T3>& template_inst) { \
2985return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \
2987#define ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(temp) \
2988template <typename T1, typename T2, typename T3, typename T4> \
2989inline MessageBuilder& operator<<(const temp<T1, T2, T3, T4>& template_inst) { \
2990return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \
2992#define ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG(temp) \
2993template <typename T1, typename T2, typename T3, typename T4, typename T5> \
2994inline MessageBuilder& operator<<(const temp<T1, T2, T3, T4, T5>& template_inst) { \
2995return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \
2998#if defined(ELPP_STL_LOGGING)
3006 template <
class T,
class Container>
3007 inline MessageBuilder&
operator<<(
const std::queue<T, Container>& queue_) {
3008 base::workarounds::IterableQueue<T, Container> iterableQueue_ =
3009 static_cast<base::workarounds::IterableQueue<T, Container>
>(queue_);
3010 return writeIterator(iterableQueue_.begin(), iterableQueue_.end(), iterableQueue_.size());
3012 template <
class T,
class Container>
3013 inline MessageBuilder&
operator<<(
const std::stack<T, Container>& stack_) {
3014 base::workarounds::IterableStack<T, Container> iterableStack_ =
3015 static_cast<base::workarounds::IterableStack<T, Container>
>(stack_);
3016 return writeIterator(iterableStack_.begin(), iterableStack_.end(), iterableStack_.size());
3018 template <
class T,
class Container,
class Comparator>
3019 inline MessageBuilder&
operator<<(
const std::priority_queue<T, Container, Comparator>& priorityQueue_) {
3020 base::workarounds::IterablePriorityQueue<T, Container, Comparator> iterablePriorityQueue_ =
3021 static_cast<base::workarounds::IterablePriorityQueue<T, Container, Comparator>
>(priorityQueue_);
3022 return writeIterator(iterablePriorityQueue_.begin(), iterablePriorityQueue_.end(), iterablePriorityQueue_.size());
3024 template <
class First,
class Second>
3025 MessageBuilder&
operator<<(
const std::pair<First, Second>& pair_) {
3027 operator << (static_cast<First>(pair_.first));
3029 operator << (static_cast<Second>(pair_.second));
3033 template <std::
size_t Size>
3034 MessageBuilder&
operator<<(
const std::bitset<Size>& bitset_) {
3040# if defined(ELPP_LOG_STD_ARRAY)
3041 template <
class T, std::
size_t Size>
3042 inline MessageBuilder&
operator<<(
const std::array<T, Size>& array) {
3043 return writeIterator(array.begin(), array.end(), array.size());
3046# if defined(ELPP_LOG_UNORDERED_MAP)
3050# if defined(ELPP_LOG_UNORDERED_SET)
3055#if defined(ELPP_QT_LOGGING)
3056 inline MessageBuilder&
operator<<(
const QString& msg) {
3057# if defined(ELPP_UNICODE)
3058 m_logger->stream() << msg.toStdWString();
3060 m_logger->stream() << msg.toStdString();
3064 inline MessageBuilder&
operator<<(
const QByteArray& msg) {
3067 inline MessageBuilder&
operator<<(
const QStringRef& msg) {
3070 inline MessageBuilder&
operator<<(qint64 msg) {
3071# if defined(ELPP_UNICODE)
3072 m_logger->stream() << QString::number(msg).toStdWString();
3074 m_logger->stream() << QString::number(msg).toStdString();
3078 inline MessageBuilder&
operator<<(quint64 msg) {
3079# if defined(ELPP_UNICODE)
3080 m_logger->stream() << QString::number(msg).toStdWString();
3082 m_logger->stream() << QString::number(msg).toStdString();
3086 inline MessageBuilder&
operator<<(QChar msg) {
3087 m_logger->stream() << msg.toLatin1();
3090 inline MessageBuilder&
operator<<(
const QLatin1String& msg) {
3091 m_logger->stream() << msg.latin1();
3100 template <
typename First,
typename Second>
3101 MessageBuilder&
operator<<(
const QPair<First, Second>& pair_) {
3103 operator << (static_cast<First>(pair_.first));
3105 operator << (static_cast<Second>(pair_.second));
3109 template <
typename K,
typename V>
3110 MessageBuilder&
operator<<(
const QMap<K, V>& map_) {
3112 QList<K> keys = map_.keys();
3113 typename QList<K>::const_iterator begin = keys.begin();
3114 typename QList<K>::const_iterator end = keys.end();
3115 int max_ =
static_cast<int>(base::consts::kMaxLogPerContainer);
3116 for (
int index_ = 0; begin != end && index_ < max_; ++index_, ++begin) {
3118 operator << (static_cast<K>(*begin));
3120 operator << (static_cast<V>(map_.value(*begin)));
3122 m_logger->stream() << ((index_ < keys.size() -1) ? m_containerLogSeperator :
ELPP_LITERAL(
""));
3130 template <
typename K,
typename V>
3131 inline MessageBuilder&
operator<<(
const QMultiMap<K, V>& map_) {
3135 template <
typename K,
typename V>
3136 MessageBuilder&
operator<<(
const QHash<K, V>& hash_) {
3138 QList<K> keys = hash_.keys();
3139 typename QList<K>::const_iterator begin = keys.begin();
3140 typename QList<K>::const_iterator end = keys.end();
3141 int max_ =
static_cast<int>(base::consts::kMaxLogPerContainer);
3142 for (
int index_ = 0; begin != end && index_ < max_; ++index_, ++begin) {
3144 operator << (static_cast<K>(*begin));
3146 operator << (static_cast<V>(hash_.value(*begin)));
3148 m_logger->stream() << ((index_ < keys.size() -1) ? m_containerLogSeperator :
ELPP_LITERAL(
""));
3156 template <
typename K,
typename V>
3157 inline MessageBuilder&
operator<<(
const QMultiHash<K, V>& multiHash_) {
3158 operator << (
static_cast<QHash<K, V>
>(multiHash_));
3162#if defined(ELPP_BOOST_LOGGING)
3181#define MAKE_CONTAINERELPP_FRIENDLY(ContainerType, SizeMethod, ElementInstance) \
3182el::base::type::ostream_t& operator<<(el::base::type::ostream_t& ss, const ContainerType& container) {\
3183const el::base::type::char_t* sep = ELPP->hasFlag(el::LoggingFlag::NewLineForContainer) ? \
3184ELPP_LITERAL("\n ") : ELPP_LITERAL(", ");\
3185ContainerType::const_iterator elem = container.begin();\
3186ContainerType::const_iterator endElem = container.end();\
3187std::size_t size_ = container.SizeMethod; \
3188ss << ELPP_LITERAL("[");\
3189for (std::size_t i = 0; elem != endElem && i < el::base::consts::kMaxLogPerContainer; ++i, ++elem) { \
3190ss << ElementInstance;\
3191ss << ((i < size_ - 1) ? sep : ELPP_LITERAL(""));\
3193if (elem != endElem) {\
3194ss << ELPP_LITERAL("...");\
3196ss << ELPP_LITERAL("]");\
3199#if defined(ELPP_WXWIDGETS_LOGGING)
3201# define ELPP_WX_PTR_ENABLED(ContainerType) MAKE_CONTAINERELPP_FRIENDLY(ContainerType, size(), *(*elem))
3202# define ELPP_WX_ENABLED(ContainerType) MAKE_CONTAINERELPP_FRIENDLY(ContainerType, size(), (*elem))
3203# define ELPP_WX_HASH_MAP_ENABLED(ContainerType) MAKE_CONTAINERELPP_FRIENDLY(ContainerType, size(), \
3204ELPP_LITERAL("(") << elem->first << ELPP_LITERAL(", ") << elem->second << ELPP_LITERAL(")")
3206# define ELPP_WX_PTR_ENABLED(ContainerType)
3207# define ELPP_WX_ENABLED(ContainerType)
3208# define ELPP_WX_HASH_MAP_ENABLED(ContainerType)
3211 template <
class Class>
3213#undef ELPP_SIMPLE_LOG
3214#undef ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG
3215#undef ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG
3216#undef ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG
3217#undef ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG
3218#undef ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG
3223 template<
class Iterator>
3230 if (begin_ != end_) {
3250 template <
typename T>
3255 inline operator bool() {
3279#if ELPP_LOGGING_ENABLED
3287 inline operator bool() {
3291 Writer& construct(
Logger* logger,
bool needLock =
true);
3292 Writer& construct(
int count,
const char* loggerIds, ...);
3293 Writer& construct(
const char *loggerId);
3310 void initializeLogger(
const std::string& loggerId,
bool lookup =
true,
bool needLock =
true);
3320 base::
Writer(level, color, file, line, func, dispatchAction, verboseLevel) {
3327#if ELPP_VARIADIC_TEMPLATES_SUPPORTED
3328template <
typename T,
typename... Args>
3329void Logger::log_(Level level,
int vlevel,
const char*
s,
const T&
value,
const Args&... args) {
3330 base::MessageBuilder
b;
3333 if (*
s == base::consts::kFormatSpecifierChar) {
3334 if (*(
s + 1) == base::consts::kFormatSpecifierChar) {
3337 if (*(
s + 1) == base::consts::kFormatSpecifierCharValue) {
3340 log_(level, vlevel, ++
s,
args...);
3347 ELPP_INTERNAL_ERROR(
"Too many arguments provided. Unable to handle. Please provide more format specifiers",
false);
3349template <
typename T>
3350void Logger::log_(Level level,
int vlevel,
const T& log) {
3351 if (level == Level::Verbose) {
3352 if (
ELPP->vRegistry()->allowed(vlevel, __FILE__)) {
3353 base::Writer(Level::Verbose, Color::Default,
"FILE", 0,
"FUNCTION",
3354 base::DispatchAction::NormalLog, vlevel).construct(
this,
false) <<
log;
3360 base::Writer(level, Color::Default,
"FILE", 0,
"FUNCTION").construct(
this,
false) <<
log;
3363template <
typename T,
typename...
Args>
3364inline void Logger::log(Level level,
const char*
s,
const T&
value,
const Args&... args) {
3368template <
typename T>
3369inline void Logger::log(Level level,
const T& log) {
3371 log_(level, 0, log);
3373# if ELPP_VERBOSE_LOG
3374template <
typename T,
typename...
Args>
3375inline void Logger::verbose(
int vlevel,
const char*
s,
const T&
value,
const Args&... args) {
3379template <
typename T>
3380inline void Logger::verbose(
int vlevel,
const T& log) {
3385template <
typename T,
typename...
Args>
3386inline void Logger::verbose(
int,
const char*,
const T&,
const Args&...) {
3389template <
typename T>
3390inline void Logger::verbose(
int,
const T&) {
3394# define LOGGER_LEVEL_WRITERS(FUNCTION_NAME, LOG_LEVEL)\
3395template <typename T, typename... Args>\
3396inline void Logger::FUNCTION_NAME(const char* s, const T& value, const Args&... args) {\
3397log(LOG_LEVEL, s, value, args...);\
3399template <typename T>\
3400inline void Logger::FUNCTION_NAME(const T& value) {\
3401log(LOG_LEVEL, value);\
3403# define LOGGER_LEVEL_WRITERS_DISABLED(FUNCTION_NAME, LOG_LEVEL)\
3404template <typename T, typename... Args>\
3405inline void Logger::FUNCTION_NAME(const char*, const T&, const Args&...) {\
3408template <typename T>\
3409inline void Logger::FUNCTION_NAME(const T&) {\
3414LOGGER_LEVEL_WRITERS(
info, Level::Info)
3416LOGGER_LEVEL_WRITERS_DISABLED(
info, Level::Info)
3419LOGGER_LEVEL_WRITERS(debug, Level::Debug)
3421LOGGER_LEVEL_WRITERS_DISABLED(debug, Level::Debug)
3423# if ELPP_WARNING_LOG
3424LOGGER_LEVEL_WRITERS(warn, Level::Warning)
3426LOGGER_LEVEL_WRITERS_DISABLED(warn, Level::Warning)
3429LOGGER_LEVEL_WRITERS(error, Level::Error)
3431LOGGER_LEVEL_WRITERS_DISABLED(error, Level::Error)
3434LOGGER_LEVEL_WRITERS(fatal, Level::Fatal)
3436LOGGER_LEVEL_WRITERS_DISABLED(fatal, Level::Fatal)
3439LOGGER_LEVEL_WRITERS(trace, Level::Trace)
3441LOGGER_LEVEL_WRITERS_DISABLED(trace, Level::Trace)
3443# undef LOGGER_LEVEL_WRITERS
3444# undef LOGGER_LEVEL_WRITERS_DISABLED
3446#if ELPP_COMPILER_MSVC
3447# define ELPP_VARIADIC_FUNC_MSVC(variadicFunction, variadicArgs) variadicFunction variadicArgs
3448# define ELPP_VARIADIC_FUNC_MSVC_RUN(variadicFunction, ...) ELPP_VARIADIC_FUNC_MSVC(variadicFunction, (__VA_ARGS__))
3449# define el_getVALength(...) ELPP_VARIADIC_FUNC_MSVC_RUN(el_resolveVALength, 0, ## __VA_ARGS__,\
345010, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
3452# if ELPP_COMPILER_CLANG
3453# define el_getVALength(...) el_resolveVALength(0, __VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
3455# define el_getVALength(...) el_resolveVALength(0, ## __VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
3458#define el_resolveVALength(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
3459#define ELPP_WRITE_LOG(writer, level, dispatchAction, ...) \
3460writer(level, el::Color::Default, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
3461#define ELPP_WRITE_LOG_IF(writer, condition, level, dispatchAction, ...) if (condition) \
3462writer(level, el::Color::Default, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
3463#define ELPP_WRITE_LOG_EVERY_N(writer, occasion, level, dispatchAction, ...) \
3464ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion) && \
3465writer(level, el::Color::Default, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
3466#define ELPP_WRITE_LOG_AFTER_N(writer, n, level, dispatchAction, ...) \
3467ELPP->validateAfterNCounter(__FILE__, __LINE__, n) && \
3468writer(level, el::Color::Default, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
3469#define ELPP_WRITE_LOG_N_TIMES(writer, n, level, dispatchAction, ...) \
3470ELPP->validateNTimesCounter(__FILE__, __LINE__, n) && \
3471writer(level, el::Color::Default, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
3472#if defined(ELPP_FEATURE_ALL) || defined(ELPP_FEATURE_PERFORMANCE_TRACKING)
3473class PerformanceTrackingData {
3475 enum class DataType : base::type::EnumType {
3476 Checkpoint = 1, Complete = 2
3479 explicit PerformanceTrackingData(DataType dataType) : m_performanceTracker(
nullptr),
3480 m_dataType(dataType), m_firstCheckpoint(
false), m_file(
""), m_line(0), m_func(
"") {}
3481 inline const std::string* blockName(
void)
const;
3482 inline const struct timeval* startTime(
void)
const;
3483 inline const struct timeval* endTime(
void)
const;
3484 inline const struct timeval* lastCheckpointTime(
void)
const;
3485 inline const base::PerformanceTracker* performanceTracker(
void)
const {
3486 return m_performanceTracker;
3488 inline PerformanceTrackingData::DataType dataType(
void)
const {
3491 inline bool firstCheckpoint(
void)
const {
3492 return m_firstCheckpoint;
3494 inline std::string checkpointId(
void)
const {
3495 return m_checkpointId;
3497 inline const char* file(
void)
const {
3500 inline base::type::LineNumber line(
void)
const {
3503 inline const char* func(
void)
const {
3506 inline const base::type::string_t* formattedTimeTaken()
const {
3507 return &m_formattedTimeTaken;
3509 inline const std::string& loggerId(
void)
const;
3511 base::PerformanceTracker* m_performanceTracker;
3512 base::type::string_t m_formattedTimeTaken;
3513 PerformanceTrackingData::DataType m_dataType;
3514 bool m_firstCheckpoint;
3515 std::string m_checkpointId;
3517 base::type::LineNumber m_line;
3519 inline void init(base::PerformanceTracker* performanceTracker,
bool firstCheckpoint =
false) {
3520 m_performanceTracker = performanceTracker;
3521 m_firstCheckpoint = firstCheckpoint;
3524 friend class el::base::PerformanceTracker;
3529class PerformanceTracker :
public base::threading::ThreadSafe,
public Loggable {
3531 PerformanceTracker(
const std::string& blockName,
3532 base::TimestampUnit timestampUnit = base::TimestampUnit::Millisecond,
3533 const std::string& loggerId = std::string(el::base::consts::kPerformanceLoggerId),
3534 bool scopedLog =
true, Level level = base::consts::kPerformanceTrackerDefaultLevel);
3536 PerformanceTracker(
const PerformanceTracker& t) :
3537 m_blockName(
t.m_blockName), m_timestampUnit(
t.m_timestampUnit), m_loggerId(
t.m_loggerId), m_scopedLog(
t.m_scopedLog),
3538 m_level(
t.m_level), m_hasChecked(
t.m_hasChecked), m_lastCheckpointId(
t.m_lastCheckpointId), m_enabled(
t.m_enabled),
3539 m_startTime(
t.m_startTime), m_endTime(
t.m_endTime), m_lastCheckpointTime(
t.m_lastCheckpointTime) {
3541 virtual ~PerformanceTracker(
void);
3543 void checkpoint(
const std::string&
id = std::string(),
const char* file = __FILE__,
3544 base::type::LineNumber line = __LINE__,
3545 const char* func =
"");
3546 inline Level level(
void)
const {
3550 std::string m_blockName;
3551 base::TimestampUnit m_timestampUnit;
3552 std::string m_loggerId;
3556 std::string m_lastCheckpointId;
3558 struct timeval m_startTime, m_endTime, m_lastCheckpointTime;
3560 PerformanceTracker(
void);
3562 friend class el::PerformanceTrackingData;
3563 friend class base::DefaultPerformanceTrackingCallback;
3565 const inline base::type::string_t getFormattedTimeTaken()
const {
3566 return getFormattedTimeTaken(m_startTime);
3569 const base::type::string_t getFormattedTimeTaken(
struct timeval startTime)
const;
3572 os << getFormattedTimeTaken();
3575class DefaultPerformanceTrackingCallback :
public PerformanceTrackingCallback {
3577 void handle(
const PerformanceTrackingData*
data) {
3579 base::type::stringstream_t ss;
3580 if (m_data->dataType() == PerformanceTrackingData::DataType::Complete) {
3585 if (!m_data->checkpointId().empty()) {
3589 *m_data->performanceTracker();
3590 if (!
ELPP->hasFlag(LoggingFlag::DisablePerformanceTrackingCheckpointComparison)
3591 && m_data->performanceTracker()->m_hasChecked) {
3593 if (m_data->performanceTracker()->m_lastCheckpointId.empty()) {
3596 ss <<
ELPP_LITERAL(
"checkpoint '") << m_data->performanceTracker()->m_lastCheckpointId.c_str() <<
ELPP_LITERAL(
"'");
3603 const std::string str = ss.str();
3604 el::base::Writer(m_data->performanceTracker()->level(), m_data->file(), m_data->line(), m_data->func()).construct(1,
3605 m_data->loggerId().c_str()) << str;
3608 const PerformanceTrackingData* m_data;
3611inline const std::string* PerformanceTrackingData::blockName()
const {
3612 return const_cast<const std::string*
>(&m_performanceTracker->m_blockName);
3614inline const struct timeval* PerformanceTrackingData::startTime()
const {
3615 return const_cast<const struct timeval*
>(&m_performanceTracker->m_startTime);
3617inline const struct timeval* PerformanceTrackingData::endTime()
const {
3618 return const_cast<const struct timeval*
>(&m_performanceTracker->m_endTime);
3620inline const struct timeval* PerformanceTrackingData::lastCheckpointTime()
const {
3621 return const_cast<const struct timeval*
>(&m_performanceTracker->m_lastCheckpointTime);
3623inline const std::string& PerformanceTrackingData::loggerId(
void)
const {
3624 return m_performanceTracker->m_loggerId;
3630#if defined(ELPP_FEATURE_ALL) || defined(ELPP_FEATURE_CRASH_LOG)
3631class StackTrace : base::NoCopy {
3633 static const unsigned int kMaxStack = 64;
3634 static const unsigned int kStackStart = 2;
3635 class StackTraceEntry {
3637 StackTraceEntry(std::size_t index,
const std::string& loc,
const std::string& demang,
const std::string& hex,
3638 const std::string& addr);
3639 StackTraceEntry(std::size_t index,
const std::string& loc) :
3643 std::size_t m_index;
3644 std::string m_location;
3645 std::string m_demangled;
3648 friend std::ostream&
operator<<(std::ostream& ss,
const StackTraceEntry&
si);
3651 StackTraceEntry(
void);
3658 virtual ~StackTrace(
void) {
3661 inline std::vector<StackTraceEntry>& getLatestStack(
void) {
3665 friend std::ostream&
operator<<(std::ostream& os,
const StackTrace& st);
3668 std::vector<StackTraceEntry> m_stack;
3670 void generateNew(
void);
3673class CrashHandler : base::NoCopy {
3675 typedef void (*Handler)(int);
3677 explicit CrashHandler(
bool useDefault);
3678 explicit CrashHandler(
const Handler& cHandler) {
3679 setHandler(cHandler);
3681 void setHandler(
const Handler& cHandler);
3694extern base::debug::CrashHandler elCrashHandler;
3695#define MAKE_LOGGABLE(ClassType, ClassInstance, OutputStreamInstance) \
3696el::base::type::ostream_t& operator<<(el::base::type::ostream_t& OutputStreamInstance, const ClassType& ClassInstance)
3701#if defined(ELPP_SYSLOG)
3702 openlog(processIdent, options, facility);
3710#if defined(ELPP_SYSLOG)
3715#define ELPP_INITIALIZE_SYSLOG(id, opt, fac) el::SysLogInitializer elSyslogInit(id, opt, fac)
3728 static inline void setArgs(
int argc,
char** argv) {
3729 ELPP->setApplicationArguments(argc, argv);
3732 static inline void setArgs(
int argc,
const char** argv) {
3733 ELPP->setApplicationArguments(argc,
const_cast<char**
>(argv));
3737 ELPP->setThreadName(name);
3742#if defined(ELPP_FEATURE_ALL) || defined(ELPP_FEATURE_CRASH_LOG)
3746 static inline void setCrashHandler(
const el::base::debug::CrashHandler::Handler& crashHandler) {
3751 static void crashAbort(
int sig,
const char* sourceFile =
"",
unsigned int long line = 0);
3757 static void logCrashReason(
int sig,
bool stackTraceIfAvailable =
false,
3758 Level level = Level::Fatal,
const char* logger = base::consts::kDefaultLoggerId);
3762 static inline void installPreRollOutCallback(const PreRollOutCallback& callback) {
3763 ELPP->setPreRollOutCallback(callback);
3767 ELPP->unsetPreRollOutCallback();
3770 template <
typename T>
3772 return ELPP->installLogDispatchCallback<
T>(id);
3775 template <
typename T>
3777 ELPP->uninstallLogDispatchCallback<
T>(id);
3779 template <
typename T>
3781 return ELPP->logDispatchCallback<
T>(id);
3783#if defined(ELPP_FEATURE_ALL) || defined(ELPP_FEATURE_PERFORMANCE_TRACKING)
3785 template <
typename T>
3786 static inline bool installPerformanceTrackingCallback(
const std::string&
id) {
3787 return ELPP->installPerformanceTrackingCallback<
T>(id);
3790 template <
typename T>
3791 static inline void uninstallPerformanceTrackingCallback(
const std::string&
id) {
3792 ELPP->uninstallPerformanceTrackingCallback<
T>(id);
3794 template <
typename T>
3795 static inline T* performanceTrackingCallback(
const std::string&
id) {
3796 return ELPP->performanceTrackingCallback<
T>(id);
3800 template <typename T>
3804 if (logger ==
nullptr) {
3805 return std::string();
3808 b.initialize(logger);
3811#if defined(ELPP_UNICODE)
3812 std::string
s = std::string(logger->
stream().str().begin(), logger->
stream().str().end());
3814 std::string
s = logger->
stream().str();
3822 return ELPP->commandLineArgs();
3827 ELPP->m_customFormatSpecifiers.reserve(size);
3831 ELPP->installCustomFormatSpecifier(customFormatSpecifier);
3835 return ELPP->uninstallCustomFormatSpecifier(formatSpecifier);
3839 return ELPP->hasCustomFormatSpecifier(formatSpecifier);
3842 if (
ELPP ==
nullptr || logger ==
nullptr)
return;
3852 static Logger*
getLogger(
const std::string& identity,
bool registerIfNotAvailable =
true);
3856 template <
typename T>
3858 return ELPP->registeredLoggers()->installLoggerRegistrationCallback<
T>(id);
3861 template <
typename T>
3863 ELPP->registeredLoggers()->uninstallLoggerRegistrationCallback<
T>(id);
3865 template <
typename T>
3867 return ELPP->registeredLoggers()->loggerRegistrationCallback<
T>(id);
3871 static bool unregisterLogger(
const std::string& identity);
3873 static bool hasLogger(
const std::string& identity);
3877 static Logger* reconfigureLogger(
const std::string& identity,
const Configurations& configurations);
3880 const std::string&
value);
3882 static void reconfigureAllLoggers(
const Configurations& configurations);
3889 const std::string&
value);
3891 static void setDefaultConfigurations(
const Configurations& configurations,
3892 bool reconfigureExistingLoggers =
false);
3901 static std::vector<std::string>* populateAllLoggerIds(std::vector<std::string>* targetList);
3903 static void configureFromGlobal(
const char* globalConfigurationFilePath);
3908 static bool configureFromArg(
const char* argKey);
3910 static void flushAll(
void);
3913 ELPP->addFlag(flag);
3917 ELPP->removeFlag(flag);
3921 return ELPP->hasFlag(flag);
3949 ELPP->setLoggingLevel(level);
3956 static void setVModules(
const char* modules);
3958 static void setCategories(
const char* categories,
bool clear =
true);
3960 static std::string getCategories();
3962 static void clearVModules(
void);
3964 static void clearCategories(
void);
3966 static void setFilenameCommonPrefix(
const std::string &prefix);
3968 static const std::string &getFilenameCommonPrefix();
3973 static const std::string
version(
void);
3981#define VLOG_IS_ON(verboseLevel) (ELPP->vRegistry()->allowed(verboseLevel, __FILE__))
3984#undef TIMED_SCOPE_IF
3988#if defined(ELPP_PERFORMANCE_MICROSECONDS)
3989# define ELPP_MIN_UNIT el::base::TimestampUnit::Microsecond
3991# define ELPP_MIN_UNIT el::base::TimestampUnit::Millisecond
4000#define TIMED_SCOPE_IF(obj, blockname, condition) el::base::type::PerformanceTrackerPtr obj( condition ? \
4001 new el::base::PerformanceTracker(blockname, ELPP_MIN_UNIT) : nullptr )
4002#define TIMED_SCOPE(obj, blockname) TIMED_SCOPE_IF(obj, blockname, true)
4003#define TIMED_BLOCK(obj, blockName) for (struct { int i; el::base::type::PerformanceTrackerPtr timer; } obj = { 0, \
4004 el::base::type::PerformanceTrackerPtr(new el::base::PerformanceTracker(blockName, ELPP_MIN_UNIT)) }; obj.i < 1; ++obj.i)
4011#define TIMED_FUNC_IF(obj,condition) TIMED_SCOPE_IF(obj, ELPP_FUNC, condition)
4012#define TIMED_FUNC(obj) TIMED_SCOPE(obj, ELPP_FUNC)
4013#undef PERFORMANCE_CHECKPOINT
4014#undef PERFORMANCE_CHECKPOINT_WITH_ID
4015#define PERFORMANCE_CHECKPOINT(obj) obj->checkpoint(std::string(), __FILE__, __LINE__, ELPP_FUNC)
4016#define PERFORMANCE_CHECKPOINT_WITH_ID(obj, id) obj->checkpoint(id, __FILE__, __LINE__, ELPP_FUNC)
4018#undef ELPP_COUNTER_POS
4020#define ELPP_COUNTER (ELPP->hitCounters()->getCounter(__FILE__, __LINE__))
4022#define ELPP_COUNTER_POS (ELPP_COUNTER == nullptr ? -1 : ELPP_COUNTER->hitCounts())
4047#undef CWARNING_EVERY_N
4048#undef CDEBUG_EVERY_N
4049#undef CERROR_EVERY_N
4050#undef CFATAL_EVERY_N
4051#undef CTRACE_EVERY_N
4052#undef CVERBOSE_EVERY_N
4054#undef CWARNING_AFTER_N
4055#undef CDEBUG_AFTER_N
4056#undef CERROR_AFTER_N
4057#undef CFATAL_AFTER_N
4058#undef CTRACE_AFTER_N
4059#undef CVERBOSE_AFTER_N
4061#undef CWARNING_N_TIMES
4062#undef CDEBUG_N_TIMES
4063#undef CERROR_N_TIMES
4064#undef CFATAL_N_TIMES
4065#undef CTRACE_N_TIMES
4066#undef CVERBOSE_N_TIMES
4069# define CINFO(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Info, dispatchAction, __VA_ARGS__)
4071# define CINFO(writer, dispatchAction, ...) el::base::NullWriter()
4074# define CWARNING(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Warning, dispatchAction, __VA_ARGS__)
4076# define CWARNING(writer, dispatchAction, ...) el::base::NullWriter()
4079# define CDEBUG(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Debug, dispatchAction, __VA_ARGS__)
4081# define CDEBUG(writer, dispatchAction, ...) el::base::NullWriter()
4084# define CERROR(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Error, dispatchAction, __VA_ARGS__)
4086# define CERROR(writer, dispatchAction, ...) el::base::NullWriter()
4089# define CFATAL(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Fatal, dispatchAction, __VA_ARGS__)
4091# define CFATAL(writer, dispatchAction, ...) el::base::NullWriter()
4094# define CTRACE(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Trace, dispatchAction, __VA_ARGS__)
4096# define CTRACE(writer, dispatchAction, ...) el::base::NullWriter()
4099# define CVERBOSE(writer, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel)) writer(\
4100el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
4102# define CVERBOSE(writer, vlevel, dispatchAction, ...) el::base::NullWriter()
4106# define CINFO_IF(writer, condition_, dispatchAction, ...) \
4107ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Info, dispatchAction, __VA_ARGS__)
4109# define CINFO_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
4112# define CWARNING_IF(writer, condition_, dispatchAction, ...)\
4113ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Warning, dispatchAction, __VA_ARGS__)
4115# define CWARNING_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
4118# define CDEBUG_IF(writer, condition_, dispatchAction, ...)\
4119ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Debug, dispatchAction, __VA_ARGS__)
4121# define CDEBUG_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
4124# define CERROR_IF(writer, condition_, dispatchAction, ...)\
4125ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Error, dispatchAction, __VA_ARGS__)
4127# define CERROR_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
4130# define CFATAL_IF(writer, condition_, dispatchAction, ...)\
4131ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Fatal, dispatchAction, __VA_ARGS__)
4133# define CFATAL_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
4136# define CTRACE_IF(writer, condition_, dispatchAction, ...)\
4137ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Trace, dispatchAction, __VA_ARGS__)
4139# define CTRACE_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
4142# define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel) && (condition_)) writer( \
4143el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
4145# define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) el::base::NullWriter()
4149# define CINFO_EVERY_N(writer, occasion, dispatchAction, ...)\
4150ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Info, dispatchAction, __VA_ARGS__)
4152# define CINFO_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()
4155# define CWARNING_EVERY_N(writer, occasion, dispatchAction, ...)\
4156ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Warning, dispatchAction, __VA_ARGS__)
4158# define CWARNING_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()
4161# define CDEBUG_EVERY_N(writer, occasion, dispatchAction, ...)\
4162ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Debug, dispatchAction, __VA_ARGS__)
4164# define CDEBUG_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()
4167# define CERROR_EVERY_N(writer, occasion, dispatchAction, ...)\
4168ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Error, dispatchAction, __VA_ARGS__)
4170# define CERROR_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()
4173# define CFATAL_EVERY_N(writer, occasion, dispatchAction, ...)\
4174ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Fatal, dispatchAction, __VA_ARGS__)
4176# define CFATAL_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()
4179# define CTRACE_EVERY_N(writer, occasion, dispatchAction, ...)\
4180ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Trace, dispatchAction, __VA_ARGS__)
4182# define CTRACE_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()
4185# define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, ...)\
4186CVERBOSE_IF(writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion), vlevel, dispatchAction, __VA_ARGS__)
4188# define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, ...) el::base::NullWriter()
4192# define CINFO_AFTER_N(writer, n, dispatchAction, ...)\
4193ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Info, dispatchAction, __VA_ARGS__)
4195# define CINFO_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()
4198# define CWARNING_AFTER_N(writer, n, dispatchAction, ...)\
4199ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Warning, dispatchAction, __VA_ARGS__)
4201# define CWARNING_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()
4204# define CDEBUG_AFTER_N(writer, n, dispatchAction, ...)\
4205ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Debug, dispatchAction, __VA_ARGS__)
4207# define CDEBUG_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()
4210# define CERROR_AFTER_N(writer, n, dispatchAction, ...)\
4211ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Error, dispatchAction, __VA_ARGS__)
4213# define CERROR_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()
4216# define CFATAL_AFTER_N(writer, n, dispatchAction, ...)\
4217ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Fatal, dispatchAction, __VA_ARGS__)
4219# define CFATAL_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()
4222# define CTRACE_AFTER_N(writer, n, dispatchAction, ...)\
4223ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Trace, dispatchAction, __VA_ARGS__)
4225# define CTRACE_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()
4228# define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, ...)\
4229CVERBOSE_IF(writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)
4231# define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, ...) el::base::NullWriter()
4235# define CINFO_N_TIMES(writer, n, dispatchAction, ...)\
4236ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Info, dispatchAction, __VA_ARGS__)
4238# define CINFO_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()
4241# define CWARNING_N_TIMES(writer, n, dispatchAction, ...)\
4242ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Warning, dispatchAction, __VA_ARGS__)
4244# define CWARNING_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()
4247# define CDEBUG_N_TIMES(writer, n, dispatchAction, ...)\
4248ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Debug, dispatchAction, __VA_ARGS__)
4250# define CDEBUG_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()
4253# define CERROR_N_TIMES(writer, n, dispatchAction, ...)\
4254ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Error, dispatchAction, __VA_ARGS__)
4256# define CERROR_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()
4259# define CFATAL_N_TIMES(writer, n, dispatchAction, ...)\
4260ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Fatal, dispatchAction, __VA_ARGS__)
4262# define CFATAL_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()
4265# define CTRACE_N_TIMES(writer, n, dispatchAction, ...)\
4266ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Trace, dispatchAction, __VA_ARGS__)
4268# define CTRACE_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()
4271# define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, ...)\
4272CVERBOSE_IF(writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)
4274# define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, ...) el::base::NullWriter()
4284#undef CLOG_VERBOSE_IF
4293#define CLOG(LEVEL, ...)\
4294C##LEVEL(el::base::Writer, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4295#define CVLOG(vlevel, ...) CVERBOSE(el::base::Writer, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4297#define CLOG_IF(condition, LEVEL, ...)\
4298C##LEVEL##_IF(el::base::Writer, condition, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4299#define CVLOG_IF(condition, vlevel, ...)\
4300CVERBOSE_IF(el::base::Writer, condition, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4302#define CLOG_EVERY_N(n, LEVEL, ...)\
4303C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4304#define CVLOG_EVERY_N(n, vlevel, ...)\
4305CVERBOSE_EVERY_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4306#define CLOG_AFTER_N(n, LEVEL, ...)\
4307C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4308#define CVLOG_AFTER_N(n, vlevel, ...)\
4309CVERBOSE_AFTER_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4310#define CLOG_N_TIMES(n, LEVEL, ...)\
4311C##LEVEL##_N_TIMES(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4312#define CVLOG_N_TIMES(n, vlevel, ...)\
4313CVERBOSE_N_TIMES(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4328#undef ELPP_CURR_FILE_LOGGER_ID
4329#if defined(ELPP_DEFAULT_LOGGER)
4330# define ELPP_CURR_FILE_LOGGER_ID ELPP_DEFAULT_LOGGER
4332# define ELPP_CURR_FILE_LOGGER_ID el::base::consts::kDefaultLoggerId
4335#define ELPP_TRACE CLOG(TRACE, ELPP_CURR_FILE_LOGGER_ID)
4337#define LOG(LEVEL) CLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4338#define VLOG(vlevel) CVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID)
4340#define LOG_IF(condition, LEVEL) CLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4341#define VLOG_IF(condition, vlevel) CVLOG_IF(condition, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4343#define LOG_EVERY_N(n, LEVEL) CLOG_EVERY_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4344#define VLOG_EVERY_N(n, vlevel) CVLOG_EVERY_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4345#define LOG_AFTER_N(n, LEVEL) CLOG_AFTER_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4346#define VLOG_AFTER_N(n, vlevel) CVLOG_AFTER_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4347#define LOG_N_TIMES(n, LEVEL) CLOG_N_TIMES(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4348#define VLOG_N_TIMES(n, vlevel) CVLOG_N_TIMES(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4358#define CPLOG(LEVEL, ...)\
4359C##LEVEL(el::base::PErrorWriter, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4360#define CPLOG_IF(condition, LEVEL, ...)\
4361C##LEVEL##_IF(el::base::PErrorWriter, condition, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4362#define DCPLOG(LEVEL, ...)\
4363if (ELPP_DEBUG_LOG) C##LEVEL(el::base::PErrorWriter, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4364#define DCPLOG_IF(condition, LEVEL, ...)\
4365C##LEVEL##_IF(el::base::PErrorWriter, (ELPP_DEBUG_LOG) && (condition), el::base::DispatchAction::NormalLog, __VA_ARGS__)
4366#define PLOG(LEVEL) CPLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4367#define PLOG_IF(condition, LEVEL) CPLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4368#define DPLOG(LEVEL) DCPLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4369#define DPLOG_IF(condition, LEVEL) DCPLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4373#undef CSYSLOG_EVERY_N
4374#undef CSYSLOG_AFTER_N
4375#undef CSYSLOG_N_TIMES
4378#undef SYSLOG_EVERY_N
4379#undef SYSLOG_AFTER_N
4380#undef SYSLOG_N_TIMES
4383#undef DCSYSLOG_EVERY_N
4384#undef DCSYSLOG_AFTER_N
4385#undef DCSYSLOG_N_TIMES
4388#undef DSYSLOG_EVERY_N
4389#undef DSYSLOG_AFTER_N
4390#undef DSYSLOG_N_TIMES
4391#if defined(ELPP_SYSLOG)
4392# define CSYSLOG(LEVEL, ...)\
4393C##LEVEL(el::base::Writer, el::base::DispatchAction::SysLog, __VA_ARGS__)
4394# define CSYSLOG_IF(condition, LEVEL, ...)\
4395C##LEVEL##_IF(el::base::Writer, condition, el::base::DispatchAction::SysLog, __VA_ARGS__)
4396# define CSYSLOG_EVERY_N(n, LEVEL, ...) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)
4397# define CSYSLOG_AFTER_N(n, LEVEL, ...) C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)
4398# define CSYSLOG_N_TIMES(n, LEVEL, ...) C##LEVEL##_N_TIMES(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)
4399# define SYSLOG(LEVEL) CSYSLOG(LEVEL, el::base::consts::kSysLogLoggerId)
4400# define SYSLOG_IF(condition, LEVEL) CSYSLOG_IF(condition, LEVEL, el::base::consts::kSysLogLoggerId)
4401# define SYSLOG_EVERY_N(n, LEVEL) CSYSLOG_EVERY_N(n, LEVEL, el::base::consts::kSysLogLoggerId)
4402# define SYSLOG_AFTER_N(n, LEVEL) CSYSLOG_AFTER_N(n, LEVEL, el::base::consts::kSysLogLoggerId)
4403# define SYSLOG_N_TIMES(n, LEVEL) CSYSLOG_N_TIMES(n, LEVEL, el::base::consts::kSysLogLoggerId)
4404# define DCSYSLOG(LEVEL, ...) if (ELPP_DEBUG_LOG) C##LEVEL(el::base::Writer, el::base::DispatchAction::SysLog, __VA_ARGS__)
4405# define DCSYSLOG_IF(condition, LEVEL, ...)\
4406C##LEVEL##_IF(el::base::Writer, (ELPP_DEBUG_LOG) && (condition), el::base::DispatchAction::SysLog, __VA_ARGS__)
4407# define DCSYSLOG_EVERY_N(n, LEVEL, ...)\
4408if (ELPP_DEBUG_LOG) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)
4409# define DCSYSLOG_AFTER_N(n, LEVEL, ...)\
4410if (ELPP_DEBUG_LOG) C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)
4411# define DCSYSLOG_N_TIMES(n, LEVEL, ...)\
4412if (ELPP_DEBUG_LOG) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)
4413# define DSYSLOG(LEVEL) DCSYSLOG(LEVEL, el::base::consts::kSysLogLoggerId)
4414# define DSYSLOG_IF(condition, LEVEL) DCSYSLOG_IF(condition, LEVEL, el::base::consts::kSysLogLoggerId)
4415# define DSYSLOG_EVERY_N(n, LEVEL) DCSYSLOG_EVERY_N(n, LEVEL, el::base::consts::kSysLogLoggerId)
4416# define DSYSLOG_AFTER_N(n, LEVEL) DCSYSLOG_AFTER_N(n, LEVEL, el::base::consts::kSysLogLoggerId)
4417# define DSYSLOG_N_TIMES(n, LEVEL) DCSYSLOG_N_TIMES(n, LEVEL, el::base::consts::kSysLogLoggerId)
4419# define CSYSLOG(LEVEL, ...) el::base::NullWriter()
4420# define CSYSLOG_IF(condition, LEVEL, ...) el::base::NullWriter()
4421# define CSYSLOG_EVERY_N(n, LEVEL, ...) el::base::NullWriter()
4422# define CSYSLOG_AFTER_N(n, LEVEL, ...) el::base::NullWriter()
4423# define CSYSLOG_N_TIMES(n, LEVEL, ...) el::base::NullWriter()
4424# define SYSLOG(LEVEL) el::base::NullWriter()
4425# define SYSLOG_IF(condition, LEVEL) el::base::NullWriter()
4426# define SYSLOG_EVERY_N(n, LEVEL) el::base::NullWriter()
4427# define SYSLOG_AFTER_N(n, LEVEL) el::base::NullWriter()
4428# define SYSLOG_N_TIMES(n, LEVEL) el::base::NullWriter()
4429# define DCSYSLOG(LEVEL, ...) el::base::NullWriter()
4430# define DCSYSLOG_IF(condition, LEVEL, ...) el::base::NullWriter()
4431# define DCSYSLOG_EVERY_N(n, LEVEL, ...) el::base::NullWriter()
4432# define DCSYSLOG_AFTER_N(n, LEVEL, ...) el::base::NullWriter()
4433# define DCSYSLOG_N_TIMES(n, LEVEL, ...) el::base::NullWriter()
4434# define DSYSLOG(LEVEL) el::base::NullWriter()
4435# define DSYSLOG_IF(condition, LEVEL) el::base::NullWriter()
4436# define DSYSLOG_EVERY_N(n, LEVEL) el::base::NullWriter()
4437# define DSYSLOG_AFTER_N(n, LEVEL) el::base::NullWriter()
4438# define DSYSLOG_N_TIMES(n, LEVEL) el::base::NullWriter()
4449#undef DCVLOG_EVERY_N
4451#undef DCVLOG_AFTER_N
4453#undef DCVLOG_N_TIMES
4455#define DCLOG(LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG(LEVEL, __VA_ARGS__)
4456#define DCLOG_VERBOSE(vlevel, ...) if (ELPP_DEBUG_LOG) CLOG_VERBOSE(vlevel, __VA_ARGS__)
4457#define DCVLOG(vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG(vlevel, __VA_ARGS__)
4459#define DCLOG_IF(condition, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_IF(condition, LEVEL, __VA_ARGS__)
4460#define DCVLOG_IF(condition, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_IF(condition, vlevel, __VA_ARGS__)
4462#define DCLOG_EVERY_N(n, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_EVERY_N(n, LEVEL, __VA_ARGS__)
4463#define DCVLOG_EVERY_N(n, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_EVERY_N(n, vlevel, __VA_ARGS__)
4464#define DCLOG_AFTER_N(n, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_AFTER_N(n, LEVEL, __VA_ARGS__)
4465#define DCVLOG_AFTER_N(n, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_AFTER_N(n, vlevel, __VA_ARGS__)
4466#define DCLOG_N_TIMES(n, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_N_TIMES(n, LEVEL, __VA_ARGS__)
4467#define DCVLOG_N_TIMES(n, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_N_TIMES(n, vlevel, __VA_ARGS__)
4471#if !defined(ELPP_NO_DEBUG_MACROS)
4484#define DLOG(LEVEL) DCLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4485#define DVLOG(vlevel) DCVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID)
4487#define DLOG_IF(condition, LEVEL) DCLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4488#define DVLOG_IF(condition, vlevel) DCVLOG_IF(condition, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4490#define DLOG_EVERY_N(n, LEVEL) DCLOG_EVERY_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4491#define DVLOG_EVERY_N(n, vlevel) DCVLOG_EVERY_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4492#define DLOG_AFTER_N(n, LEVEL) DCLOG_AFTER_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4493#define DVLOG_AFTER_N(n, vlevel) DCVLOG_AFTER_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4494#define DLOG_N_TIMES(n, LEVEL) DCLOG_N_TIMES(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4495#define DVLOG_N_TIMES(n, vlevel) DCVLOG_N_TIMES(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4497#if !defined(ELPP_NO_CHECK_MACROS)
4508#undef CCHECK_NOTNULL
4509#undef CCHECK_STRCASEEQ
4510#undef CCHECK_STRCASENE
4521#undef CHECK_STRCASEEQ
4522#undef CHECK_STRCASENE
4523#define CCHECK(condition, ...) CLOG_IF(!(condition), FATAL, __VA_ARGS__) << "Check failed: [" << #condition << "] "
4524#define CPCHECK(condition, ...) CPLOG_IF(!(condition), FATAL, __VA_ARGS__) << "Check failed: [" << #condition << "] "
4525#define CHECK(condition) CCHECK(condition, ELPP_CURR_FILE_LOGGER_ID)
4526#define PCHECK(condition) CPCHECK(condition, ELPP_CURR_FILE_LOGGER_ID)
4527#define CCHECK_EQ(a, b, ...) CCHECK(a == b, __VA_ARGS__)
4528#define CCHECK_NE(a, b, ...) CCHECK(a != b, __VA_ARGS__)
4529#define CCHECK_LT(a, b, ...) CCHECK(a < b, __VA_ARGS__)
4530#define CCHECK_GT(a, b, ...) CCHECK(a > b, __VA_ARGS__)
4531#define CCHECK_LE(a, b, ...) CCHECK(a <= b, __VA_ARGS__)
4532#define CCHECK_GE(a, b, ...) CCHECK(a >= b, __VA_ARGS__)
4533#define CCHECK_BOUNDS(val, min, max, ...) CCHECK(val >= min && val <= max, __VA_ARGS__)
4534#define CHECK_EQ(a, b) CCHECK_EQ(a, b, ELPP_CURR_FILE_LOGGER_ID)
4535#define CHECK_NE(a, b) CCHECK_NE(a, b, ELPP_CURR_FILE_LOGGER_ID)
4536#define CHECK_LT(a, b) CCHECK_LT(a, b, ELPP_CURR_FILE_LOGGER_ID)
4537#define CHECK_GT(a, b) CCHECK_GT(a, b, ELPP_CURR_FILE_LOGGER_ID)
4538#define CHECK_LE(a, b) CCHECK_LE(a, b, ELPP_CURR_FILE_LOGGER_ID)
4539#define CHECK_GE(a, b) CCHECK_GE(a, b, ELPP_CURR_FILE_LOGGER_ID)
4540#define CHECK_BOUNDS(val, min, max) CCHECK_BOUNDS(val, min, max, ELPP_CURR_FILE_LOGGER_ID)
4541#define CCHECK_NOTNULL(ptr, ...) CCHECK((ptr) != nullptr, __VA_ARGS__)
4542#define CCHECK_STREQ(str1, str2, ...) CLOG_IF(!el::base::utils::Str::cStringEq(str1, str2), FATAL, __VA_ARGS__) \
4543<< "Check failed: [" << #str1 << " == " << #str2 << "] "
4544#define CCHECK_STRNE(str1, str2, ...) CLOG_IF(el::base::utils::Str::cStringEq(str1, str2), FATAL, __VA_ARGS__) \
4545<< "Check failed: [" << #str1 << " != " << #str2 << "] "
4546#define CCHECK_STRCASEEQ(str1, str2, ...) CLOG_IF(!el::base::utils::Str::cStringCaseEq(str1, str2), FATAL, __VA_ARGS__) \
4547<< "Check failed: [" << #str1 << " == " << #str2 << "] "
4548#define CCHECK_STRCASENE(str1, str2, ...) CLOG_IF(el::base::utils::Str::cStringCaseEq(str1, str2), FATAL, __VA_ARGS__) \
4549<< "Check failed: [" << #str1 << " != " << #str2 << "] "
4550#define CHECK_NOTNULL(ptr) CCHECK_NOTNULL((ptr), ELPP_CURR_FILE_LOGGER_ID)
4551#define CHECK_STREQ(str1, str2) CCHECK_STREQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4552#define CHECK_STRNE(str1, str2) CCHECK_STRNE(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4553#define CHECK_STRCASEEQ(str1, str2) CCHECK_STRCASEEQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4554#define CHECK_STRCASENE(str1, str2) CCHECK_STRCASENE(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4562#undef DCCHECK_BOUNDS
4563#undef DCCHECK_NOTNULL
4564#undef DCCHECK_STRCASEEQ
4565#undef DCCHECK_STRCASENE
4574#undef DCHECK_BOUNDS_
4575#undef DCHECK_NOTNULL
4576#undef DCHECK_STRCASEEQ
4577#undef DCHECK_STRCASENE
4579#define DCCHECK(condition, ...) if (ELPP_DEBUG_LOG) CCHECK(condition, __VA_ARGS__)
4580#define DCCHECK_EQ(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_EQ(a, b, __VA_ARGS__)
4581#define DCCHECK_NE(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_NE(a, b, __VA_ARGS__)
4582#define DCCHECK_LT(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_LT(a, b, __VA_ARGS__)
4583#define DCCHECK_GT(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_GT(a, b, __VA_ARGS__)
4584#define DCCHECK_LE(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_LE(a, b, __VA_ARGS__)
4585#define DCCHECK_GE(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_GE(a, b, __VA_ARGS__)
4586#define DCCHECK_BOUNDS(val, min, max, ...) if (ELPP_DEBUG_LOG) CCHECK_BOUNDS(val, min, max, __VA_ARGS__)
4587#define DCCHECK_NOTNULL(ptr, ...) if (ELPP_DEBUG_LOG) CCHECK_NOTNULL((ptr), __VA_ARGS__)
4588#define DCCHECK_STREQ(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STREQ(str1, str2, __VA_ARGS__)
4589#define DCCHECK_STRNE(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STRNE(str1, str2, __VA_ARGS__)
4590#define DCCHECK_STRCASEEQ(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STRCASEEQ(str1, str2, __VA_ARGS__)
4591#define DCCHECK_STRCASENE(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STRCASENE(str1, str2, __VA_ARGS__)
4592#define DCPCHECK(condition, ...) if (ELPP_DEBUG_LOG) CPCHECK(condition, __VA_ARGS__)
4593#define DCHECK(condition) DCCHECK(condition, ELPP_CURR_FILE_LOGGER_ID)
4594#define DCHECK_EQ(a, b) DCCHECK_EQ(a, b, ELPP_CURR_FILE_LOGGER_ID)
4595#define DCHECK_NE(a, b) DCCHECK_NE(a, b, ELPP_CURR_FILE_LOGGER_ID)
4596#define DCHECK_LT(a, b) DCCHECK_LT(a, b, ELPP_CURR_FILE_LOGGER_ID)
4597#define DCHECK_GT(a, b) DCCHECK_GT(a, b, ELPP_CURR_FILE_LOGGER_ID)
4598#define DCHECK_LE(a, b) DCCHECK_LE(a, b, ELPP_CURR_FILE_LOGGER_ID)
4599#define DCHECK_GE(a, b) DCCHECK_GE(a, b, ELPP_CURR_FILE_LOGGER_ID)
4600#define DCHECK_BOUNDS(val, min, max) DCCHECK_BOUNDS(val, min, max, ELPP_CURR_FILE_LOGGER_ID)
4601#define DCHECK_NOTNULL(ptr) DCCHECK_NOTNULL((ptr), ELPP_CURR_FILE_LOGGER_ID)
4602#define DCHECK_STREQ(str1, str2) DCCHECK_STREQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4603#define DCHECK_STRNE(str1, str2) DCCHECK_STRNE(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4604#define DCHECK_STRCASEEQ(str1, str2) DCCHECK_STRCASEEQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4605#define DCHECK_STRCASENE(str1, str2) DCCHECK_STRCASENE(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4606#define DPCHECK(condition) DCPCHECK(condition, ELPP_CURR_FILE_LOGGER_ID)
4608#if defined(ELPP_DISABLE_DEFAULT_CRASH_HANDLING)
4609# define ELPP_USE_DEF_CRASH_HANDLER false
4611# define ELPP_USE_DEF_CRASH_HANDLER true
4613#define ELPP_CRASH_HANDLER_INIT
4614#define ELPP_INIT_EASYLOGGINGPP(val) \
4617el::base::type::StoragePointer elStorage(val); \
4619el::base::debug::CrashHandler elCrashHandler(ELPP_USE_DEF_CRASH_HANDLER); \
4622#if ELPP_ASYNC_LOGGING
4623# define INITIALIZE_EASYLOGGINGPP ELPP_INIT_EASYLOGGINGPP(new el::base::Storage(el::LogBuilderPtr(new el::base::DefaultLogBuilder()),\
4624new el::base::AsyncDispatchWorker()))
4626# define INITIALIZE_EASYLOGGINGPP ELPP_INIT_EASYLOGGINGPP(new el::base::Storage(el::LogBuilderPtr(new el::base::DefaultLogBuilder())))
4628#define INITIALIZE_NULL_EASYLOGGINGPP \
4631el::base::type::StoragePointer elStorage;\
4633el::base::debug::CrashHandler elCrashHandler(ELPP_USE_DEF_CRASH_HANDLER);\
4635#define SHARE_EASYLOGGINGPP(initializedStorage)\
4638el::base::type::StoragePointer elStorage(initializedStorage);\
4640el::base::debug::CrashHandler elCrashHandler(ELPP_USE_DEF_CRASH_HANDLER);\
4643#if defined(ELPP_UNICODE)
4644# define START_EASYLOGGINGPP(argc, argv) el::Helpers::setArgs(argc, argv); std::locale::global(std::locale(""))
4646# define START_EASYLOGGINGPP(argc, argv) el::Helpers::setArgs(argc, argv)
#define si(y, x, c)
Definition aesb.c:48
#define s(x, c)
Definition aesb.c:47
std::ostream & operator<<(std::ostream &os, const Student &s)
Definition archivertest.cpp:30
cryptonote::block b
Definition block.cpp:40
JSON writer.
Definition writer.h:89
void setEnabled(bool enabled)
Definition easylogging++.h:2190
bool m_enabled
Definition easylogging++.h:2197
Callback(void)
Definition easylogging++.h:2186
virtual void handle(const T *handlePtr)=0
bool enabled(void) const
Definition easylogging++.h:2187
Static class that contains helper functions for el::ConfigurationType.
Definition easylogging++.h:696
static const char * convertToString(ConfigurationType configurationType)
Converts configuration type to associated const char*.
Definition easylogging++.cc:264
static void forEachConfigType(base::type::EnumType *startIndex, const std::function< bool(void)> &fn)
Applies specified function to each configuration type starting from startIndex.
Definition easylogging++.cc:305
static ConfigurationType castFromInt(base::type::EnumType c)
Casts int(ushort) to configurationt type, useful for iterating through enum.
Definition easylogging++.h:707
static ConfigurationType convertFromString(const char *configStr)
Converts from configStr to ConfigurationType.
Definition easylogging++.cc:296
static const base::type::EnumType kMaxValid
Represents maximum valid configuration type. This is used internally and you should not need it.
Definition easylogging++.h:701
static base::type::EnumType castToInt(ConfigurationType configurationType)
Casts configuration type to int, useful for iterating through enum.
Definition easylogging++.h:703
static const base::type::EnumType kMinValid
Represents minimum valid configuration type. Useful when iterating through enum.
Definition easylogging++.h:699
bool operator()(const Configuration *conf) const
Definition easylogging++.cc:351
Predicate(Level level, ConfigurationType configurationType)
Used to find configuration from configuration (pointers) repository. Avoid using it.
Definition easylogging++.cc:346
ConfigurationType m_configurationType
Definition easylogging++.h:1757
Level m_level
Definition easylogging++.h:1756
Represents single configuration that has representing level, configuration type and a string based va...
Definition easylogging++.h:1713
void setValue(const std::string &value)
Set string based configuration value.
Definition easylogging++.h:1742
const std::string & value(void) const
Gets string based configuration value.
Definition easylogging++.h:1735
ConfigurationType m_configurationType
Definition easylogging++.h:1762
Level m_level
Definition easylogging++.h:1761
std::string m_value
Definition easylogging++.h:1763
Configuration & operator=(const Configuration &c)
Definition easylogging++.cc:323
Level level(void) const
Gets level of current configuration.
Definition easylogging++.h:1725
Configuration(const Configuration &c)
Definition easylogging++.cc:317
virtual ~Configuration(void)
Definition easylogging++.h:1718
ConfigurationType configurationType(void) const
Gets configuration type of current configuration.
Definition easylogging++.h:1730
Parser used internally to parse configurations from file or text.
Definition easylogging++.h:1879
static bool isConfig(const std::string &line)
Definition easylogging++.cc:550
static bool parseLine(std::string *line, std::string *currConfigStr, std::string *currLevelStr, Level *currLevel, Configurations *conf)
Definition easylogging++.cc:558
static bool parseFromFile(const std::string &configurationFile, Configurations *sender, Configurations *base=nullptr)
Parses configuration from file.
Definition easylogging++.cc:489
static void ignoreComments(std::string *line)
Definition easylogging++.cc:523
static bool isLevel(const std::string &line)
Definition easylogging++.cc:542
static bool parseFromText(const std::string &configurationsString, Configurations *sender, Configurations *base=nullptr)
Parse configurations from configuration string.
Definition easylogging++.cc:507
static bool isComment(const std::string &line)
Definition easylogging++.cc:546
Thread-safe Configuration repository.
Definition easylogging++.h:1769
void unsafeSet(Level level, ConfigurationType configurationType, const std::string &value)
Thread unsafe set.
Definition easylogging++.cc:625
void clear(void)
Clears repository so that all the configurations are unset.
Definition easylogging++.h:1851
Configuration * get(Level level, ConfigurationType configurationType)
Definition easylogging++.h:1837
void setGlobally(ConfigurationType configurationType, const std::string &value)
Sets configuration for all levels.
Definition easylogging++.h:1846
std::string m_configurationFile
Definition easylogging++.h:1915
void unsafeSetGlobally(ConfigurationType configurationType, const std::string &value, bool includeGlobalLevel)
Sets configurations (Unsafely) for all levels including Level::Global if includeGlobalLevel is true.
Definition easylogging++.cc:649
void unsafeSetIfNotExist(Level level, ConfigurationType configurationType, const std::string &value)
Unsafely sets configuration if does not already exist.
Definition easylogging++.cc:618
const std::string & configurationFile(void) const
Gets configuration file used in parsing this configurations.
Definition easylogging++.h:1859
bool m_isFromFile
Definition easylogging++.h:1916
Configurations(void)
Default constructor with empty repository.
Definition easylogging++.cc:357
virtual ~Configurations(void)
Definition easylogging++.h:1783
Static helpers for developers.
Definition easylogging++.h:3717
static base::type::StoragePointer storage()
Definition easylogging++.h:3724
static bool hasCustomFormatSpecifier(const char *formatSpecifier)
Returns true if custom format specifier is installed.
Definition easylogging++.h:3838
static bool uninstallCustomFormatSpecifier(const char *formatSpecifier)
Uninstalls user defined format specifier and handler.
Definition easylogging++.h:3834
static void setThreadName(const std::string &name)
Sets thread name for current thread. Requires std::thread.
Definition easylogging++.h:3736
static bool installLogDispatchCallback(const std::string &id)
Installs post log dispatch callback, this callback is triggered when log is dispatched.
Definition easylogging++.h:3771
static void setArgs(int argc, char **argv)
Sets application arguments and figures out whats active for logging and whats not.
Definition easylogging++.h:3728
static std::string convertTemplateToStdString(const T &templ)
Converts template to std::string - useful for loggable classes to log containers within log(std::ostr...
Definition easylogging++.h:3801
static T * logDispatchCallback(const std::string &id)
Definition easylogging++.h:3780
static void installCustomFormatSpecifier(const CustomFormatSpecifier &customFormatSpecifier)
Installs user defined format specifier and handler.
Definition easylogging++.h:3830
static const el::base::utils::CommandLineArgs * commandLineArgs(void)
Returns command line arguments (pointer) provided to easylogging++.
Definition easylogging++.h:3821
static void uninstallPreRollOutCallback(void)
Uninstalls pre rollout callback.
Definition easylogging++.h:3766
static void uninstallLogDispatchCallback(const std::string &id)
Uninstalls log dispatch callback.
Definition easylogging++.h:3776
static std::string getThreadName()
Definition easylogging++.h:3739
static void validateFileRolling(Logger *logger, Level level)
Definition easylogging++.h:3841
static void setStorage(base::type::StoragePointer storage)
Shares logging repository (base::Storage).
Definition easylogging++.h:3720
static void setArgs(int argc, const char **argv)
Sets application arguments and figures out whats active for logging and whats not.
Definition easylogging++.h:3732
static void reserveCustomFormatSpecifiers(std::size_t size)
Reserve space for custom format specifiers for performance.
Definition easylogging++.h:3826
Static class that contains helper functions for el::Level.
Definition easylogging++.h:631
static Level castFromInt(base::type::EnumType l)
Casts int(ushort) to level, useful for iterating through enum.
Definition easylogging++.h:642
static Level convertFromString(const char *levelStr)
Converts from levelStr to Level.
Definition easylogging++.cc:223
static const base::type::EnumType kMinValid
Represents minimum valid level. Useful when iterating through enum.
Definition easylogging++.h:634
static base::type::EnumType castToInt(Level level)
Casts level to int, useful for iterating through enum.
Definition easylogging++.h:638
static Level convertFromStringPrefix(const char *levelStr)
Converts from prefix of levelStr to Level.
Definition easylogging++.cc:232
static void forEachLevel(base::type::EnumType *startIndex, const std::function< bool(void)> &fn)
Applies specified function to each level starting from startIndex.
Definition easylogging++.cc:252
static const base::type::EnumType kMaxValid
Represents maximum valid level. This is used internally and you should not need it.
Definition easylogging++.h:636
static const char * convertToString(Level level)
Converts level to associated const char*.
Definition easylogging++.cc:194
Definition easylogging++.h:2237
LogBuilder()
Definition easylogging++.h:2239
void convertToColoredOutput(base::type::string_t *logLine, Level level, Color color)
Definition easylogging++.cc:663
virtual base::type::string_t build(const LogMessage *logMessage, bool appendNewLine) const =0
void setColor(Color color, bool bright)
Definition easylogging++.cc:693
virtual ~LogBuilder(void)
Definition easylogging++.h:2240
bool m_termSupportsColor
Definition easylogging++.h:2247
Definition easylogging++.h:2220
base::threading::Mutex & fileHandle(const LogDispatchData *data)
Definition easylogging++.cc:2436
base::threading::Mutex m_fileLocksMapLock
Definition easylogging++.h:2227
std::unordered_map< std::string, std::unique_ptr< base::threading::Mutex > > m_fileLocks
Definition easylogging++.h:2226
virtual void handle(const LogDispatchData *data)
Definition easylogging++.cc:2425
Definition easylogging++.h:2199
void setLogMessage(LogMessage *logMessage)
Definition easylogging++.h:2208
LogDispatchData()
Definition easylogging++.h:2201
base::DispatchAction dispatchAction(void) const
Definition easylogging++.h:2205
base::DispatchAction m_dispatchAction
Definition easylogging++.h:2216
LogMessage * m_logMessage
Definition easylogging++.h:2215
const LogMessage * logMessage(void) const
Definition easylogging++.h:2202
void setDispatchAction(base::DispatchAction dispatchAction)
Definition easylogging++.h:2211
Definition easylogging++.h:2516
const base::type::string_t & message(void) const
Definition easylogging++.h:2544
const std::string & file(void) const
Definition easylogging++.h:2529
base::type::VerboseLevel m_verboseLevel
Definition easylogging++.h:2553
Color m_color
Definition easylogging++.h:2549
Level level(void) const
Definition easylogging++.h:2523
const std::string & func(void) const
Definition easylogging++.h:2535
Color color(void) const
Definition easylogging++.h:2526
std::string m_file
Definition easylogging++.h:2550
base::type::LineNumber line(void) const
Definition easylogging++.h:2532
base::type::VerboseLevel verboseLevel(void) const
Definition easylogging++.h:2538
Logger * m_logger
Definition easylogging++.h:2554
base::type::string_t m_message
Definition easylogging++.h:2555
Logger * logger(void) const
Definition easylogging++.h:2541
Level m_level
Definition easylogging++.h:2548
base::type::LineNumber m_line
Definition easylogging++.h:2551
std::string m_func
Definition easylogging++.h:2552
LogMessage(Level level, Color color, const std::string &file, base::type::LineNumber line, const std::string &func, base::type::VerboseLevel verboseLevel, Logger *logger, const base::type::string_t *msg=nullptr)
Definition easylogging++.h:2518
Base of Easylogging++ friendly class.
Definition easylogging++.h:1603
friend el::base::type::ostream_t & operator<<(el::base::type::ostream_t &os, const Loggable &loggable)
Definition easylogging++.h:1608
virtual ~Loggable(void)
Definition easylogging++.h:1605
virtual void log(el::base::type::ostream_t &) const =0
Definition easylogging++.h:2233
Represents a logger holding ID and configurations we need to write logs.
Definition easylogging++.h:2254
base::type::stringstream_t m_stream
Definition easylogging++.h:2342
std::unordered_map< Level, unsigned int > m_unflushedCount
Definition easylogging++.h:2346
Configurations m_configurations
Definition easylogging++.h:2345
const std::string & id(void) const
Definition easylogging++.h:2275
Logger & operator=(const Logger &logger)
Definition easylogging++.cc:732
LogBuilder * logBuilder(void) const
Definition easylogging++.h:2306
Logger(const std::string &id, base::LogStreamsReferenceMap *logStreamsReference)
Definition easylogging++.cc:702
void setParentApplicationName(const std::string &parentApplicationName)
Definition easylogging++.h:2283
LogBuilderPtr m_logBuilder
Definition easylogging++.h:2348
void setLogBuilder(const LogBuilderPtr &logBuilder)
Definition easylogging++.h:2310
base::TypedConfigurations * typedConfigurations(void)
Definition easylogging++.h:2291
std::string m_id
Definition easylogging++.h:2340
Configurations * configurations(void)
Definition easylogging++.h:2287
base::TypedConfigurations * m_typedConfigurations
Definition easylogging++.h:2341
bool enabled(Level level) const
Definition easylogging++.h:2314
virtual void log(el::base::type::ostream_t &os) const
Definition easylogging++.h:2265
base::LogStreamsReferenceMap * m_logStreamsReference
Definition easylogging++.h:2347
base::type::stringstream_t & stream(void)
Definition easylogging++.h:2380
bool isFlushNeeded(Level level)
Definition easylogging++.h:2302
bool m_isConfigured
Definition easylogging++.h:2344
virtual ~Logger(void)
Definition easylogging++.h:2261
void initUnflushedCount(void)
Definition easylogging++.cc:803
const std::string & parentApplicationName(void) const
Definition easylogging++.h:2279
std::string m_parentApplicationName
Definition easylogging++.h:2343
ScopedAddFlag(LoggingFlag flag)
Definition easylogging++.h:3926
LoggingFlag m_flag
Definition easylogging++.h:3933
~ScopedAddFlag(void)
Definition easylogging++.h:3929
LoggingFlag m_flag
Definition easylogging++.h:3945
~ScopedRemoveFlag(void)
Definition easylogging++.h:3941
ScopedRemoveFlag(LoggingFlag flag)
Definition easylogging++.h:3938
Static helpers to deal with loggers and their configurations.
Definition easylogging++.h:3847
static bool allowed(Level leve, const char *cat)
Determines whether logging will occur at this level and category.
Definition easylogging++.cc:3370
static void reconfigureAllLoggers(ConfigurationType configurationType, const std::string &value)
Reconfigures single configuration for all the loggers.
Definition easylogging++.h:3884
static void removeFlag(LoggingFlag flag)
Removes logging flag used internally.
Definition easylogging++.h:3916
static void reconfigureAllLoggers(const Configurations &configurations)
Reconfigures all the existing loggers with new configurations.
Definition easylogging++.cc:3415
static Logger * getLogger(const std::string &identity, bool registerIfNotAvailable=true)
Gets existing or registers new logger.
Definition easylogging++.cc:3378
static bool hasFlag(LoggingFlag flag)
Determines whether or not certain flag is active.
Definition easylogging++.h:3920
static void uninstallLoggerRegistrationCallback(const std::string &id)
Uninstalls log dispatch callback.
Definition easylogging++.h:3862
static bool installLoggerRegistrationCallback(const std::string &id)
Installs logger registration callback, this callback is triggered when new logger is registered.
Definition easylogging++.h:3857
static void setDefaultLogBuilder(el::LogBuilderPtr &logBuilderPtr)
Changes default log builder for future loggers.
Definition easylogging++.cc:3382
static void addFlag(LoggingFlag flag)
Adds logging flag used internally.
Definition easylogging++.h:3912
static void setLoggingLevel(Level level)
Sets hierarchy for logging. Needs to enable logging flag (HierarchicalLogging).
Definition easylogging++.h:3948
static T * loggerRegistrationCallback(const std::string &id)
Definition easylogging++.h:3866
SysLogInitializer(const char *processIdent, int options=0, int facility=0)
Definition easylogging++.h:3700
virtual ~SysLogInitializer(void)
Definition easylogging++.h:3709
Definition easylogging++.h:3970
static const std::string version(void)
Current version number.
Definition easylogging++.cc:3559
static const std::string releaseDate(void)
Release date of current version.
Definition easylogging++.cc:3563
Definition easylogging++.h:2835
base::type::string_t build(const LogMessage *logMessage, bool appendNewLine) const
Definition easylogging++.cc:2788
Definition easylogging++.h:2796
void handle(const LogDispatchData *data)
Definition easylogging++.cc:2457
void dispatch(base::type::string_t &&rawLinePrefix, base::type::string_t &&rawLinePayload, base::type::string_t &&logLine)
Definition easylogging++.cc:2602
const LogDispatchData * m_data
Definition easylogging++.h:2800
Predicate(const char *filename, base::type::LineNumber lineNumber)
Definition easylogging++.h:2137
const char * m_filename
Definition easylogging++.h:2148
base::type::LineNumber m_lineNumber
Definition easylogging++.h:2149
bool operator()(const HitCounter *counter)
Definition easylogging++.h:2141
Class that keeps record of current line hit for occasional logging.
Definition easylogging++.h:2073
void validateHitCounts(std::size_t n)
Validates hit counts and resets it if necessary.
Definition easylogging++.h:2112
HitCounter(const char *filename, base::type::LineNumber lineNumber)
Definition easylogging++.h:2081
HitCounter(void)
Definition easylogging++.h:2075
void resetLocation(const char *filename, base::type::LineNumber lineNumber)
Resets location of current hit counter.
Definition easylogging++.h:2106
base::type::LineNumber m_lineNumber
Definition easylogging++.h:2154
virtual ~HitCounter(void)
Definition easylogging++.h:2102
HitCounter & operator=(const HitCounter &hitCounter)
Definition easylogging++.h:2093
base::type::LineNumber lineNumber(void) const
Definition easylogging++.h:2123
HitCounter(const HitCounter &hitCounter)
Definition easylogging++.h:2087
std::size_t m_hitCounts
Definition easylogging++.h:2155
std::size_t hitCounts(void) const
Definition easylogging++.h:2127
const char * filename(void) const
Definition easylogging++.h:2119
void increment(void)
Definition easylogging++.h:2131
const char * m_filename
Definition easylogging++.h:2153
Dispatches log messages.
Definition easylogging++.h:2840
LogDispatcher(bool proceed, LogMessage *logMessage, base::DispatchAction dispatchAction)
Definition easylogging++.h:2842
LogMessage * m_logMessage
Definition easylogging++.h:2852
bool m_proceed
Definition easylogging++.h:2851
base::DispatchAction m_dispatchAction
Definition easylogging++.h:2853
Definition easylogging++.h:2932
Logger * m_logger
Definition easylogging++.h:3220
MessageBuilder & operator<<(const std::string &msg)
Definition easylogging++.h:2946
MessageBuilder & writeIterator(Iterator begin_, Iterator end_, std::size_t size_)
Definition easylogging++.h:3224
MessageBuilder & operator<<(std::ostream &(*OStreamMani)(std::ostream &))
Definition easylogging++.h:2968
MessageBuilder(void)
Definition easylogging++.h:2934
const base::type::char_t * m_containerLogSeperator
Definition easylogging++.h:3221
Internal helper class that prevent copy constructor for class.
Definition easylogging++.h:569
NoCopy & operator=(const NoCopy &)
NoCopy(void)
Definition easylogging++.h:571
NullWriter & operator<<(std::ostream &(*)(std::ostream &))
Definition easylogging++.h:3246
NullWriter(void)
Definition easylogging++.h:3243
NullWriter & operator<<(const T &)
Definition easylogging++.h:3251
Definition easylogging++.h:3315
PErrorWriter(Level level, Color color, const char *file, base::type::LineNumber line, const char *func, base::DispatchAction dispatchAction=base::DispatchAction::NormalLog, base::type::VerboseLevel verboseLevel=0)
Definition easylogging++.h:3317
Repository for hit counters used across the application.
Definition easylogging++.h:2158
const base::HitCounter * getCounter(const char *filename, base::type::LineNumber lineNumber)
Gets hit counter registered at specified position.
Definition easylogging++.h:2173
bool validateEveryN(const char *filename, base::type::LineNumber lineNumber, std::size_t n)
Validates counter for every N, i.e, registers new if does not exist otherwise updates original one.
Definition easylogging++.cc:1954
bool validateNTimes(const char *filename, base::type::LineNumber lineNumber, std::size_t n)
Validates counter for hits are <= n, i.e, registers new if does not exist otherwise updates original ...
Definition easylogging++.cc:1984
bool validateAfterN(const char *filename, base::type::LineNumber lineNumber, std::size_t n)
Validates counter for hits >= N, i.e, registers new if does not exist otherwise updates original one.
Definition easylogging++.cc:1967
Loggers repository.
Definition easylogging++.h:2388
std::unordered_map< std::string, base::type::LoggerRegistrationCallbackPtr > m_loggerRegistrationCallbacks
Definition easylogging++.h:2452
Logger * get(const std::string &id, bool forceCreation=true)
Definition easylogging++.cc:2004
void setDefaultConfigurations(const Configurations &configurations)
Definition easylogging++.h:2396
base::LogStreamsReferenceMap * logStreamsReference(void)
Definition easylogging++.h:2434
T * loggerRegistrationCallback(const std::string &id)
Definition easylogging++.h:2419
bool installLoggerRegistrationCallback(const std::string &id)
Definition easylogging++.h:2408
void unsafeFlushAll(void)
Definition easylogging++.cc:2041
Configurations * defaultConfigurations(void)
Definition easylogging++.h:2401
bool has(const std::string &id)
Definition easylogging++.h:2425
void flushAll(void)
Definition easylogging++.h:2438
Configurations m_defaultConfigurations
Definition easylogging++.h:2450
virtual ~RegisteredLoggers(void)
Definition easylogging++.h:2392
void unregister(Logger *&logger)
Definition easylogging++.h:2429
RegisteredLoggers(const LogBuilderPtr &defaultLogBuilder)
Definition easylogging++.cc:1999
void uninstallLoggerRegistrationCallback(const std::string &id)
Definition easylogging++.h:2414
base::LogStreamsReferenceMap m_logStreamsReference
Definition easylogging++.h:2451
LogBuilderPtr m_defaultLogBuilder
Definition easylogging++.h:2449
void setDefaultLogBuilder(LogBuilderPtr &logBuilderPtr)
Definition easylogging++.h:2443
Internal helper class that makes all default constructors private.
Definition easylogging++.h:580
StaticClass & operator=(const StaticClass &)
StaticClass(const StaticClass &)
Easylogging++ management storage.
Definition easylogging++.h:2617
base::threading::Mutex & customFormatSpecifiersLock()
Definition easylogging++.h:2701
base::RegisteredHitCounters * m_registeredHitCounters
Definition easylogging++.h:2761
base::VRegistry * m_vRegistry
Definition easylogging++.h:2764
void setLoggingLevel(Level level)
Definition easylogging++.h:2705
void setThreadName(const std::string &name)
Sets thread name for current thread. Requires std::thread.
Definition easylogging++.h:2743
std::unordered_map< std::string, std::string > m_threadNames
Definition easylogging++.h:2773
bool hasFlag(LoggingFlag flag) const
Definition easylogging++.h:2669
void unsetPreRollOutCallback(void)
Definition easylogging++.h:2685
void uninstallLogDispatchCallback(const std::string &id)
Definition easylogging++.h:2715
void addFlag(LoggingFlag flag)
Definition easylogging++.h:2661
base::RegisteredLoggers * m_registeredLoggers
Definition easylogging++.h:2762
Storage(const LogBuilderPtr &defaultLogBuilder)
Definition easylogging++.cc:2301
PreRollOutCallback m_preRollOutCallback
Definition easylogging++.h:2770
T * logDispatchCallback(const std::string &id)
Definition easylogging++.h:2719
void setFlags(base::type::EnumType flags)
Definition easylogging++.h:2677
const std::vector< CustomFormatSpecifier > * customFormatSpecifiers(void) const
Definition easylogging++.h:2697
const base::utils::CommandLineArgs * commandLineArgs(void) const
Definition easylogging++.h:2657
void setPreRollOutCallback(const PreRollOutCallback &callback)
Definition easylogging++.h:2681
bool validateEveryNCounter(const char *filename, base::type::LineNumber lineNumber, std::size_t occasion)
Definition easylogging++.h:2627
base::RegisteredLoggers * registeredLoggers(void) const
Definition easylogging++.h:2643
std::unordered_map< std::string, base::type::LogDispatchCallbackPtr > m_logDispatchCallbacks
Definition easylogging++.h:2771
void removeFlag(LoggingFlag flag)
Definition easylogging++.h:2665
base::threading::Mutex m_threadNamesLock
Definition easylogging++.h:2776
base::RegisteredHitCounters * hitCounters(void) const
Definition easylogging++.h:2639
std::unordered_map< std::string, base::type::PerformanceTrackingCallbackPtr > m_performanceTrackingCallbacks
Definition easylogging++.h:2772
void setApplicationArguments(int argc, const char **argv)
Definition easylogging++.h:2789
bool validateAfterNCounter(const char *filename, base::type::LineNumber lineNumber, std::size_t n)
Definition easylogging++.h:2631
void setApplicationArguments(int argc, char **argv)
Definition easylogging++.cc:2394
std::vector< CustomFormatSpecifier > m_customFormatSpecifiers
Definition easylogging++.h:2774
Level m_loggingLevel
Definition easylogging++.h:2777
base::VRegistry * vRegistry(void) const
Definition easylogging++.h:2647
base::type::EnumType m_flags
Definition easylogging++.h:2763
bool installLogDispatchCallback(const std::string &id)
Definition easylogging++.h:2710
base::threading::Mutex m_customFormatSpecifiersLock
Definition easylogging++.h:2775
base::type::EnumType flags(void) const
Definition easylogging++.h:2673
std::string getThreadName(const std::string &threadId)
Definition easylogging++.h:2749
PreRollOutCallback & preRollOutCallback(void)
Definition easylogging++.h:2689
bool validateNTimesCounter(const char *filename, base::type::LineNumber lineNumber, std::size_t n)
Definition easylogging++.h:2635
base::utils::CommandLineArgs m_commandLineArgs
Definition easylogging++.h:2769
A subsecond precision class containing actual width and offset of the subsecond part.
Definition easylogging++.h:865
unsigned int m_offset
Definition easylogging++.h:877
bool operator==(const SubsecondPrecision &ssPrec)
Definition easylogging++.h:873
SubsecondPrecision(void)
Definition easylogging++.h:867
int m_width
Definition easylogging++.h:876
void init(int width)
Definition easylogging++.cc:1519
SubsecondPrecision(int width)
Definition easylogging++.h:870
Configurations with data types.
Definition easylogging++.h:1943
Conf_T & getConfigByRef(Level level, std::unordered_map< Level, Conf_T > *confMap, const char *confName)
Definition easylogging++.h:1998
Conf_T getConfigByVal(Level level, const std::unordered_map< Level, Conf_T > *confMap, const char *confName)
Definition easylogging++.h:1992
const Configurations * configurations(void) const
Definition easylogging++.h:1955
TypedConfigurations(Configurations *configurations, base::LogStreamsReferenceMap *logStreamsReference)
Constructor to initialize (construct) the object off el::Configurations.
Definition easylogging++.cc:1728
std::unordered_map< Level, base::SubsecondPrecision > m_subsecondPrecisionMap
Definition easylogging++.h:1978
std::unordered_map< Level, std::size_t > m_maxLogFileSizeMap
Definition easylogging++.h:1981
bool unsafeValidateFileRolling(Level level, const PreRollOutCallback &preRollOutCallback)
Definition easylogging++.cc:1933
std::unordered_map< Level, base::LogFormat > m_logFormatMap
Definition easylogging++.h:1977
virtual ~TypedConfigurations(void)
Definition easylogging++.h:1952
Conf_T & unsafeGetConfigByRef(Level level, std::unordered_map< Level, Conf_T > *confMap, const char *confName)
Definition easylogging++.h:2021
std::unordered_map< Level, bool > m_performanceTrackingMap
Definition easylogging++.h:1979
std::unordered_map< Level, base::FileStreamPtr > m_fileStreamMap
Definition easylogging++.h:1980
std::unordered_map< Level, bool > m_toStandardOutputMap
Definition easylogging++.h:1976
std::unordered_map< Level, bool > m_toFileMap
Definition easylogging++.h:1974
Conf_T unsafeGetConfigByVal(Level level, const std::unordered_map< Level, Conf_T > *confMap, const char *confName)
Definition easylogging++.h:2004
std::unordered_map< Level, std::size_t > m_logFlushThresholdMap
Definition easylogging++.h:1982
Configurations * m_configurations
Definition easylogging++.h:1972
base::LogStreamsReferenceMap * m_logStreamsReference
Definition easylogging++.h:1983
void setValue(Level level, const Conf_T &value, std::unordered_map< Level, Conf_T > *confMap, bool includeGlobalLevel=true)
Definition easylogging++.h:2038
std::unordered_map< Level, std::string > m_filenameMap
Definition easylogging++.h:1975
std::unordered_map< Level, bool > m_enabledMap
Definition easylogging++.h:1973
bool validateFileRolling(Level level, const PreRollOutCallback &preRollOutCallback)
Definition easylogging++.h:2067
Represents registries for verbose logging.
Definition easylogging++.h:2458
const std::string & getFilenameCommonPrefix() const
Definition easylogging++.h:2502
std::map< std::string, int > m_cached_allowed_categories
Definition easylogging++.h:2511
void clearModules(void)
Definition easylogging++.h:2471
base::type::VerboseLevel m_level
Definition easylogging++.h:2507
std::string m_categoriesString
Definition easylogging++.h:2512
std::vector< std::pair< std::string, Level > > m_categories
Definition easylogging++.h:2510
std::string m_filenameCommonPrefix
Definition easylogging++.h:2513
void setFilenameCommonPrefix(const std::string &prefix)
Definition easylogging++.h:2498
const std::unordered_map< std::string, base::type::VerboseLevel > & modules(void) const
Definition easylogging++.h:2487
base::type::VerboseLevel level(void) const
Definition easylogging++.h:2465
base::type::EnumType * m_pFlags
Definition easylogging++.h:2508
std::unordered_map< std::string, base::type::VerboseLevel > m_modules
Definition easylogging++.h:2509
VRegistry(base::type::VerboseLevel level, base::type::EnumType *pFlags)
Definition easylogging++.cc:2052
bool vModulesEnabled(void)
Whether or not vModules enabled.
Definition easylogging++.h:2494
void setLevel(base::type::VerboseLevel level)
Sets verbose level. Accepted range is 0-9.
Definition easylogging++.cc:2056
Main entry point of each logging.
Definition easylogging++.h:3260
void initializeLogger(const std::string &loggerId, bool lookup=true, bool needLock=true)
Definition easylogging++.cc:2959
Logger * m_logger
Definition easylogging++.h:3302
const char * m_file
Definition easylogging++.h:3298
bool m_proceed
Definition easylogging++.h:3303
Level m_level
Definition easylogging++.h:3296
base::type::VerboseLevel m_verboseLevel
Definition easylogging++.h:3301
const char * m_func
Definition easylogging++.h:3300
Writer(LogMessage *msg, base::DispatchAction dispatchAction=base::DispatchAction::NormalLog)
Definition easylogging++.h:3269
base::MessageBuilder m_messageBuilder
Definition easylogging++.h:3304
Writer(Level level, Color color, const char *file, base::type::LineNumber line, const char *func, base::DispatchAction dispatchAction=base::DispatchAction::NormalLog, base::type::VerboseLevel verboseLevel=0)
Definition easylogging++.h:3262
virtual ~Writer(void)
Definition easylogging++.h:3274
std::vector< std::string > m_loggerIds
Definition easylogging++.h:3306
LogMessage * m_msg
Definition easylogging++.h:3295
const base::type::LineNumber m_line
Definition easylogging++.h:3299
Writer & operator<<(const std::string &log)
Definition easylogging++.h:3278
base::threading::ScopedLock m_sync
Definition easylogging++.h:3307
base::DispatchAction m_dispatchAction
Definition easylogging++.h:3305
Color m_color
Definition easylogging++.h:3297
void processDispatch()
Definition easylogging++.cc:3000
void triggerDispatch(void)
Definition easylogging++.cc:3053
CrashHandler(bool)
Definition easylogging++.h:3689
Base of thread safe class, this class is inheritable-only.
Definition easylogging++.h:1033
virtual void acquireLock(void) ELPP_FINAL
Definition easylogging++.h:1035
base::threading::Mutex m_mutex
Definition easylogging++.h:1042
virtual void releaseLock(void) ELPP_FINAL
Definition easylogging++.h:1036
virtual ~ThreadSafe(void)
Definition easylogging++.h:1040
ThreadSafe(void)
Definition easylogging++.h:1039
virtual base::threading::Mutex & lock(void) ELPP_FINAL
Definition easylogging++.h:1037
Mutex wrapper used when multi-threading is disabled.
Definition easylogging++.h:1008
NoMutex(void)
Definition easylogging++.h:1010
void lock(void)
Definition easylogging++.h:1011
bool try_lock(void)
Definition easylogging++.h:1012
void unlock(void)
Definition easylogging++.h:1015
Lock guard wrapper used when multi-threading is disabled.
Definition easylogging++.h:1019
NoScopedLock(Mutex &)
Definition easylogging++.h:1021
virtual ~NoScopedLock(void)
Definition easylogging++.h:1023
virtual const Container & list(void) const ELPP_FINAL
Returns underlying container by constant reference.
Definition easylogging++.h:1386
virtual void unregisterAll(void)=0
Unregisters all the pointers from current repository.
bool operator!=(const AbstractRegistry< T_Ptr, Container > &other)
Definition easylogging++.h:1324
virtual const_iterator cbegin(void) const ELPP_FINAL
Definition easylogging++.h:1361
Container::const_iterator const_iterator
Definition easylogging++.h:1298
virtual bool empty(void) const ELPP_FINAL
Definition easylogging++.h:1371
virtual iterator begin(void) ELPP_FINAL
Definition easylogging++.h:1350
void reinitDeepCopy(const AbstractRegistry< T_Ptr, Container > &sr)
Definition easylogging++.h:1395
Container m_list
Definition easylogging++.h:1401
virtual std::size_t size(void) const ELPP_FINAL
Definition easylogging++.h:1376
Container::iterator iterator
Definition easylogging++.h:1297
virtual iterator end(void) ELPP_FINAL
Definition easylogging++.h:1355
virtual ~AbstractRegistry(void)
Definition easylogging++.h:1346
AbstractRegistry & operator=(AbstractRegistry &&sr)
Assignment move operator.
Definition easylogging++.h:1337
AbstractRegistry(AbstractRegistry &&sr)
Move constructor that is useful for base classes.
Definition easylogging++.h:1304
virtual Container & list(void) ELPP_FINAL
Returns underlying container by reference.
Definition easylogging++.h:1381
virtual void deepCopy(const AbstractRegistry< T_Ptr, Container > &)=0
bool operator==(const AbstractRegistry< T_Ptr, Container > &other)
Definition easylogging++.h:1312
virtual const_iterator cend(void) const ELPP_FINAL
Definition easylogging++.h:1366
AbstractRegistry(void)
Default constructor.
Definition easylogging++.h:1301
Command line arguments for application if specified using el::Helpers::setArgs(..) or START_EASYLOGGI...
Definition easylogging++.h:1251
CommandLineArgs(int argc, char **argv)
Definition easylogging++.h:1259
void setArgs(int argc, const char **argv)
Sets arguments and parses them.
Definition easylogging++.h:1264
int m_argc
Definition easylogging++.h:1283
virtual ~CommandLineArgs(void)
Definition easylogging++.h:1262
std::unordered_map< std::string, std::string > m_paramsWithValue
Definition easylogging++.h:1285
CommandLineArgs(void)
Definition easylogging++.h:1253
CommandLineArgs(int argc, const char **argv)
Definition easylogging++.h:1256
std::vector< std::string > m_params
Definition easylogging++.h:1286
char ** m_argv
Definition easylogging++.h:1284
Contains utilities for cross-platform date/time. This class make use of el::base::utils::Str.
Definition easylogging++.h:1219
static std::string timevalToString(struct timeval tval, const char *format, const el::base::SubsecondPrecision *ssPrec)
Converts timeval (struct from ctime) to string using specified format and subsecond precision.
Definition easylogging++.cc:1298
static unsigned long long getTimeDifference(const struct timeval &endTime, const struct timeval &startTime, base::TimestampUnit timestampUnit)
Gets time difference in milli/micro second depending on timestampUnit.
Definition easylogging++.cc:1327
static void gettimeofday(struct timeval *tv)
Cross platform gettimeofday for Windows and unix platform. This can be used to determine current micr...
Definition easylogging++.cc:1265
static base::type::string_t formatTime(unsigned long long time, base::TimestampUnit timestampUnit)
Formats time to get unit accordingly, units like second if > 1000 or minutes if > 60000 etc.
Definition easylogging++.cc:1309
static std::string getDateTime(const char *format, const base::SubsecondPrecision *ssPrec)
Gets current date and time with a subsecond part.
Definition easylogging++.cc:1292
static struct::tm * buildTimeInfo(struct timeval *currTime, struct ::tm *timeInfo)
Definition easylogging++.cc:1340
static char * parseFormat(char *buf, std::size_t bufSz, const char *format, const struct tm *tInfo, std::size_t msec, const base::SubsecondPrecision *ssPrec)
Definition easylogging++.cc:1366
Definition easylogging++.h:1077
static base::type::fstream_t * newFileStream(const std::string &filename)
Creates new out file stream for specified filename.
Definition easylogging++.cc:830
static void buildStrippedFilename(const char *filename, char buff[], const std::string &commonPrefix=NULL, std::size_t limit=base::consts::kSourceFilenameMaxLength)
builds stripped filename and puts it in buff
Definition easylogging++.cc:932
static bool pathExists(const char *path, bool considerFile=false)
Determines whether or not provided path exist in current file system.
Definition easylogging++.cc:864
static void buildBaseFilename(const std::string &fullPath, char buff[], std::size_t limit=base::consts::kSourceFilenameMaxLength, const char *seperator=base::consts::kFilePathSeperator)
builds base filename and puts it in buff
Definition easylogging++.cc:948
static bool createPath(const std::string &path)
Creates specified path on file system.
Definition easylogging++.cc:881
static std::size_t getSizeOfFile(base::type::fstream_t *fs)
Gets size of file provided in stream.
Definition easylogging++.cc:854
static std::string extractPathFromFilename(const std::string &fullPath, const char *seperator=base::consts::kFilePathSeperator)
Extracts path of filename with leading slash.
Definition easylogging++.cc:921
Operating System helper static class used internally. You should not use it.
Definition easylogging++.h:1175
static std::string currentHost(void)
Gets current host name or computer name.
Definition easylogging++.cc:1235
static std::string getEnvironmentVariable(const char *variableName, const char *defaultVal, const char *alternativeBashCommand=nullptr)
Gets environment variable. This is cross-platform and CRT safe (for VC++).
Definition easylogging++.cc:1198
static const std::string getBashOutput(const char *command)
Runs command on terminal and returns the output.
Definition easylogging++.cc:1170
static std::string currentUser(void)
Gets current username.
Definition easylogging++.cc:1222
static bool termSupportsColor(std::string &term)
Whether or not the named terminal supports colors.
Definition easylogging++.cc:1253
A pointer registry mechanism to manage memory and provide search functionalities. (predicate version)...
Definition easylogging++.h:1486
T_Ptr * get(const T &arg1, const T2 arg2)
Gets pointer from repository with speicifed arguments. Arguments are passed to predicate in order to ...
Definition easylogging++.h:1556
RegistryWithPred(const RegistryWithPred &sr)
Copy constructor that is useful for base classes. Try to avoid this constructor, use move constructor...
Definition easylogging++.h:1499
RegistryWithPred< T_Ptr, Pred >::iterator iterator
Definition easylogging++.h:1488
virtual void registerNew(T_Ptr *ptr) ELPP_FINAL
Definition easylogging++.h:1549
RegistryWithPred(void)
Definition easylogging++.h:1491
virtual void unregisterAll(void) ELPP_FINAL
Definition easylogging++.h:1525
friend base::type::ostream_t & operator<<(base::type::ostream_t &os, const RegistryWithPred &sr)
Definition easylogging++.h:1517
virtual void deepCopy(const AbstractRegistry< T_Ptr, std::vector< T_Ptr * > > &sr)
Definition easylogging++.h:1565
virtual void unregister(T_Ptr *&ptr) ELPP_FINAL
Definition easylogging++.h:1534
RegistryWithPred< T_Ptr, Pred >::const_iterator const_iterator
Definition easylogging++.h:1489
virtual ~RegistryWithPred(void)
Definition easylogging++.h:1494
RegistryWithPred & operator=(const RegistryWithPred &sr)
Assignment operator that unregisters all the existing registeries and deeply copies each of repo elem...
Definition easylogging++.h:1509
A pointer registry mechanism to manage memory and provide search functionalities. (non-predicate vers...
Definition easylogging++.h:1410
virtual void deepCopy(const AbstractRegistry< T_Ptr, std::unordered_map< T_Key, T_Ptr * > > &sr) ELPP_FINAL
Definition easylogging++.h:1474
Registry & operator=(const Registry &sr)
Assignment operator that unregisters all the existing registeries and deeply copies each of repo elem...
Definition easylogging++.h:1428
Registry< T_Ptr, T_Key >::const_iterator const_iterator
Definition easylogging++.h:1413
T_Ptr * get(const T_Key &uniqKey)
Definition easylogging++.h:1466
virtual ~Registry(void)
Definition easylogging++.h:1436
Registry< T_Ptr, T_Key >::iterator iterator
Definition easylogging++.h:1412
Registry(void)
Definition easylogging++.h:1415
void unregister(const T_Key &uniqKey)
Definition easylogging++.h:1457
virtual void registerNew(const T_Key &uniqKey, T_Ptr *ptr) ELPP_FINAL
Registers new registry to repository.
Definition easylogging++.h:1451
virtual void unregisterAll(void) ELPP_FINAL
Definition easylogging++.h:1441
Registry(const Registry &sr)
Copy constructor that is useful for base classes. Try to avoid this constructor, use move constructor...
Definition easylogging++.h:1418
String utilities helper class used internally. You should not use it.
Definition easylogging++.h:1104
static bool isDigit(char c)
Checks if character is digit. Dont use libc implementation of it to prevent locale issues.
Definition easylogging++.h:1107
Definition easylogging++.h:1571
static T * callback(const std::string &id, std::unordered_map< std::string, TPtr > *mapT)
Definition easylogging++.h:1590
static bool installCallback(const std::string &id, std::unordered_map< std::string, TPtr > *mapT)
Definition easylogging++.h:1574
static void uninstallCallback(const std::string &id, std::unordered_map< std::string, TPtr > *mapT)
Definition easylogging++.h:1583
wallet init("", boost::none, "", 0, true, epee::net_utils::ssl_support_t::e_ssl_support_disabled)
#define ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(temp)
Definition easylogging++.h:2977
#define ELPP_FINAL
Definition easylogging++.h:284
#define ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(temp)
Definition easylogging++.h:2987
#define ELPP_INTERNAL_ERROR(msg, pe)
Definition easylogging++.h:207
#define ELPP_EXPORT
Definition easylogging++.h:252
#define ELPP_UNUSED(x)
Definition easylogging++.h:240
#define ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(temp)
Definition easylogging++.h:2972
#define ELPP_LITERAL(txt)
Definition easylogging++.h:539
#define ELPP_SIMPLE_LOG(LOG_TYPE)
Definition easylogging++.h:2937
#define ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(temp)
Definition easylogging++.h:2982
#define ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG(temp)
Definition easylogging++.h:2992
#define ELPP
Definition easylogging++.h:2795
#define ELPP_INTERNAL_INFO(lvl, msg)
Definition easylogging++.h:221
bool operator==(expect< T > const &lhs, expect< U > const &rhs) noexcept(noexcept(lhs.equal(rhs)))
Definition expect.h:402
#define inline
Definition inline_c.h:34
void get(std::istream &input, bool &res)
Definition io.h:61
args
Definition build_protob.py:10
log
Definition coin_info.py:14
t
Definition console.py:33
next(obj)
Definition ast.py:58
declaration and default definition for the functions used the API
Definition expect.cpp:34
static const int kCrashSignalsCount
Definition easylogging++.h:836
static const char kFormatSpecifierChar
Definition easylogging++.h:764
const struct el::base::consts::@316026342360375017143256044144076315127247255074 kCrashSignals[]
static const std::size_t kSourceLineMaxLength
Definition easylogging++.h:794
static const char * kDefaultLoggerId
Definition easylogging++.h:772
static const char * kFilePathSeperator
Definition easylogging++.h:790
const struct el::base::consts::@241223351030321172077157116072250137006277251154 kTimeFormats[]
static const unsigned int kDefaultSubsecondPrecision
Definition easylogging++.h:767
static const Level kPerformanceTrackerDefaultLevel
Definition easylogging++.h:795
static const char kFormatSpecifierCharValue
Definition easylogging++.h:763
static const unsigned int kMaxLogPerCounter
Definition easylogging++.h:765
static const std::size_t kSourceFilenameMaxLength
Definition easylogging++.h:793
static const unsigned int kMaxLogPerContainer
Definition easylogging++.h:766
static const int kTimeFormatsCount
Definition easylogging++.h:807
base::threading::internal::NoScopedLock< base::threading::Mutex > ScopedLock
Definition easylogging++.h:1030
base::threading::internal::NoMutex Mutex
Definition easylogging++.h:1029
static std::string getCurrentThreadId(void)
Definition easylogging++.h:1071
Data types used by Easylogging++.
Definition easylogging++.h:521
std::shared_ptr< PerformanceTrackingCallback > PerformanceTrackingCallbackPtr
Definition easylogging++.h:562
std::unique_ptr< el::base::PerformanceTracker > PerformanceTrackerPtr
Definition easylogging++.h:564
std::stringstream stringstream_t
Definition easylogging++.h:548
unsigned short VerboseLevel
Definition easylogging++.h:558
base::Storage * StoragePointer
Definition easylogging++.h:560
std::fstream fstream_t
Definition easylogging++.h:549
std::string string_t
Definition easylogging++.h:547
std::ostream ostream_t
Definition easylogging++.h:550
unsigned long int LineNumber
Definition easylogging++.h:559
std::shared_ptr< LogDispatchCallback > LogDispatchCallbackPtr
Definition easylogging++.h:561
unsigned int EnumType
Definition easylogging++.h:557
std::shared_ptr< LoggerRegistrationCallback > LoggerRegistrationCallbackPtr
Definition easylogging++.h:563
char char_t
Definition easylogging++.h:546
Bitwise operations for C++11 strong enum class. This casts e into Flag_T and returns value after bitw...
Definition easylogging++.h:897
static base::type::EnumType Or(Enum e, base::type::EnumType flag)
Definition easylogging++.h:907
static base::type::EnumType And(Enum e, base::type::EnumType flag)
Definition easylogging++.h:899
static base::type::EnumType Not(Enum e, base::type::EnumType flag)
Definition easylogging++.h:903
Namespace containing utility functions/static classes used internally.
Definition easylogging++.cc:119
base::type::ostream_t & operator<<(base::type::ostream_t &os, const CommandLineArgs &c)
Definition easylogging++.cc:1483
static bool hasFlag(Enum e, base::type::EnumType flag)
Definition easylogging++.h:920
static void removeFlag(Enum e, base::type::EnumType *flag)
Definition easylogging++.h:916
static void addFlag(Enum e, base::type::EnumType *flag)
Definition easylogging++.h:912
static std::enable_if< std::is_pointer< T * >::value, void >::type safeDelete(T *&pointer)
Deletes memory safely and points to null.
Definition easylogging++.h:889
Namespace containing base/internal functionality used by Easylogging++.
Definition easylogging++.cc:31
void sanitize(std::string &s)
Definition easylogging++.cc:2587
ELPP_EXPORT base::type::StoragePointer elStorage
TimestampUnit
Enum to represent timestamp unit.
Definition easylogging++.h:843
@ Day
Definition easylogging++.h:844
@ Microsecond
Definition easylogging++.h:844
@ Minute
Definition easylogging++.h:844
@ Millisecond
Definition easylogging++.h:844
@ Hour
Definition easylogging++.h:844
@ Second
Definition easylogging++.h:844
FormatFlags
Format flags used to determine specifiers that are active for performance improvements.
Definition easylogging++.h:847
@ File
Definition easylogging++.h:850
@ LoggerId
Definition easylogging++.h:849
@ FileBase
Definition easylogging++.h:861
@ Line
Definition easylogging++.h:851
@ ThreadId
Definition easylogging++.h:859
@ Function
Definition easylogging++.h:853
@ DateTime
Definition easylogging++.h:848
@ User
Definition easylogging++.h:854
@ LevelShort
Definition easylogging++.h:862
@ AppName
Definition easylogging++.h:858
@ Host
Definition easylogging++.h:855
@ Location
Definition easylogging++.h:852
DispatchAction
Action to be taken for dispatching.
Definition easylogging++.h:2179
@ NormalLog
Definition easylogging++.h:2180
@ FileOnlyLog
Definition easylogging++.h:2180
@ None
Definition easylogging++.h:2180
@ SysLog
Definition easylogging++.h:2180
std::unordered_map< std::string, FileStreamPtr > LogStreamsReferenceMap
Definition easylogging++.h:1936
std::shared_ptr< base::type::fstream_t > FileStreamPtr
Definition easylogging++.h:1935
SubsecondPrecision MillisecondsWidth
Type alias of SubsecondPrecision.
Definition easylogging++.h:882
static void defaultPreRollOutCallback(const char *, std::size_t)
Definition easylogging++.h:841
Easylogging++ entry namespace.
Definition easylogging++.cc:28
LoggingFlag
Flags used while writing logs. This flags are set by user.
Definition easylogging++.h:725
@ DisableVModulesExtensions
Disable VModules extensions.
Definition easylogging++.h:748
@ DisablePerformanceTrackingCheckpointComparison
Disables comparing performance tracker's checkpoints.
Definition easylogging++.h:744
@ DisableVModules
Disable VModules.
Definition easylogging++.h:746
@ CreateLoggerAutomatically
Creates logger automatically when not available.
Definition easylogging++.h:752
@ AutoSpacing
Adds spaces b/w logs that separated by left-shift operator.
Definition easylogging++.h:754
@ HierarchicalLogging
Enables hierarchical logging.
Definition easylogging++.h:750
@ ImmediateFlush
Flushes log with every log-entry (performance sensative) - Disabled by default.
Definition easylogging++.h:736
@ LogDetailedCrashReason
When handling crashes by default, detailed crash reason will be logged as well.
Definition easylogging++.h:732
@ NewLineForContainer
Makes sure we have new line for each container log entry.
Definition easylogging++.h:727
@ StrictLogFileSizeCheck
Enables strict file rolling.
Definition easylogging++.h:738
@ DisableApplicationAbortOnFatalLog
Allows to disable application abortion when logged using FATAL level.
Definition easylogging++.h:734
@ MultiLoggerSupport
Supports use of multiple logging in same macro, e.g, CLOG(INFO, "default", "network").
Definition easylogging++.h:742
@ IgnoreSigInt
Definition easylogging++.h:758
@ AllowVerboseIfModuleNotSpecified
Makes sure if -vmodule is used and does not specifies a module, then verbose logging is allowed via t...
Definition easylogging++.h:730
@ FixedTimeFormat
Preserves time format and does not convert it to sec, hour etc (performance tracking only).
Definition easylogging++.h:756
@ ColoredTerminalOutput
Make terminal output colorful for supported terminals.
Definition easylogging++.h:740
ConfigurationType
Represents enumeration of ConfigurationType used to configure or access certain aspect of logging.
Definition easylogging++.h:664
@ Enabled
Determines whether or not corresponding level and logger of logging is enabled You may disable all lo...
Definition easylogging++.h:667
@ Filename
Determines log file (full path) to write logs to for correponding level and logger.
Definition easylogging++.h:676
@ MaxLogFileSize
Specifies log file max size.
Definition easylogging++.h:689
@ Format
Determines format of logging corresponding level and logger.
Definition easylogging++.h:674
@ SubsecondPrecision
Specifies precision of the subsecond part. It should be within range (1-6).
Definition easylogging++.h:678
@ ToStandardOutput
Whether or not to write corresponding level and logger log to standard output. By standard output mea...
Definition easylogging++.h:672
@ PerformanceTracking
Determines whether or not performance tracking is enabled.
Definition easylogging++.h:684
@ LogFlushThreshold
Specifies number of log entries to hold until we flush pending log data.
Definition easylogging++.h:691
@ ToFile
Whether or not to write corresponding log to log file.
Definition easylogging++.h:669
std::function< std::string(const LogMessage *)> FormatSpecifierValueResolver
Resolving function for format specifier.
Definition easylogging++.h:1682
Level
Represents enumeration for severity level used to determine level of logging.
Definition easylogging++.h:591
@ Warning
Useful when application has potentially harmful situtaions.
Definition easylogging++.h:603
@ Info
Mainly useful to represent current progress of application.
Definition easylogging++.h:607
@ Global
Generic level that represents all the levels. Useful when setting global configuration for all levels...
Definition easylogging++.h:593
@ Unknown
Represents unknown level.
Definition easylogging++.h:609
@ Fatal
Severe error information that will presumably abort application.
Definition easylogging++.h:599
@ Error
Information representing errors in application but application will keep running.
Definition easylogging++.h:601
@ Debug
Informational events most useful for developers to debug application.
Definition easylogging++.h:597
@ Verbose
Information that can be highly useful and vary with verbose logging level.
Definition easylogging++.h:605
@ Trace
Information that can be useful to back-trace certain events - mostly useful than debug logs.
Definition easylogging++.h:595
base::debug::CrashHandler elCrashHandler
std::shared_ptr< LogBuilder > LogBuilderPtr
Definition easylogging++.h:2250
Color
Definition easylogging++.h:611
@ Cyan
Definition easylogging++.h:618
@ Yellow
Definition easylogging++.h:615
@ Default
Definition easylogging++.h:612
@ Blue
Definition easylogging++.h:616
@ Magenta
Definition easylogging++.h:617
@ Green
Definition easylogging++.h:614
@ Red
Definition easylogging++.h:613
std::function< void(const char *, std::size_t)> PreRollOutCallback
Definition easylogging++.h:839
Definition document.h:406
@ empty
Definition readline_buffer.h:9
internal::ArgsMatcher< InnerMatcher > Args(const InnerMatcher &matcher)
Definition gmock-generated-matchers.h:481
c
Definition wide_difficulty.py:9
const GenericPointer< typename T::ValueType > T2 value
Definition pointer.h:1225
const GenericPointer< typename T::ValueType > & pointer
Definition pointer.h:1124
#define M(w0, w14, w9, w1)
Definition sha512-blocks.c:41
tools::wallet2::message_signature_result_t result
Definition signature.cpp:62
CXA_THROW_INFO_T * info
Definition stack_trace.cpp:91
std::size_t operator()(const el::Level &l) const
Definition easylogging++.h:624
std::string data
Definition base58.cpp:37