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."
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;
2794#define ELPP el::base::Storage::getELPP()
2802#if ELPP_ASYNC_LOGGING
2809 AsyncDispatchWorker();
2810 virtual ~AsyncDispatchWorker();
2813 void emptyQueue(
void);
2814 virtual void start(
void);
2815 void handle(AsyncLogItem* logItem);
2818 void setContinueRunning(
bool value) {
2820 m_continueRunning =
value;
2823 bool continueRunning(
void)
const {
2824 return m_continueRunning;
2827 std::condition_variable cv;
2828 bool m_continueRunning;
2829 base::threading::Mutex m_continueRunningLock;
2847 void dispatch(
void);
2854#if defined(ELPP_STL_LOGGING)
2861namespace workarounds {
2863template <
typename T,
typename Container>
2864class IterableContainer {
2866 typedef typename Container::iterator iterator;
2867 typedef typename Container::const_iterator const_iterator;
2868 IterableContainer(
void) {}
2869 virtual ~IterableContainer(
void) {}
2870 iterator begin(
void) {
2871 return getContainer().begin();
2873 iterator end(
void) {
2874 return getContainer().end();
2877 virtual Container& getContainer(
void) = 0;
2880template<
typename T,
typename Container = std::vector<T>,
typename Comparator = std::less<
typename Container::value_type>>
2881class IterablePriorityQueue :
public IterableContainer<T, Container>,
2882 public std::priority_queue<T, Container, Comparator> {
2884 IterablePriorityQueue(std::priority_queue<T, Container, Comparator> queue_) {
2885 std::size_t count_ = 0;
2887 this->push(queue_.top());
2892 inline Container& getContainer(
void) {
2897template<
typename T,
typename Container = std::deque<T>>
2898class IterableQueue :
public IterableContainer<T, Container>,
public std::queue<T, Container> {
2900 IterableQueue(std::queue<T, Container> queue_) {
2901 std::size_t count_ = 0;
2902 while (++count_ < base::consts::kMaxLogPerContainer && !queue_.empty()) {
2903 this->push(queue_.front());
2908 inline Container& getContainer(
void) {
2913template<
typename T,
typename Container = std::deque<T>>
2914class IterableStack :
public IterableContainer<T, Container>,
public std::stack<T, Container> {
2916 IterableStack(std::stack<T, Container> stack_) {
2917 std::size_t count_ = 0;
2918 while (++count_ < base::consts::kMaxLogPerContainer && !stack_.empty()) {
2919 this->push(stack_.top());
2924 inline Container& getContainer(
void) {
2934 void initialize(
Logger* logger);
2936# define ELPP_SIMPLE_LOG(LOG_TYPE)\
2937MessageBuilder& operator<<(LOG_TYPE msg) {\
2938m_logger->stream() << msg;\
2939if (ELPP->hasFlag(LoggingFlag::AutoSpacing)) {\
2940m_logger->stream() << " ";\
2971#define ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG(temp) \
2972template <typename T> \
2973inline MessageBuilder& operator<<(const temp<T>& template_inst) { \
2974return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \
2976#define ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(temp) \
2977template <typename T1, typename T2> \
2978inline MessageBuilder& operator<<(const temp<T1, T2>& template_inst) { \
2979return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \
2981#define ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(temp) \
2982template <typename T1, typename T2, typename T3> \
2983inline MessageBuilder& operator<<(const temp<T1, T2, T3>& template_inst) { \
2984return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \
2986#define ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(temp) \
2987template <typename T1, typename T2, typename T3, typename T4> \
2988inline MessageBuilder& operator<<(const temp<T1, T2, T3, T4>& template_inst) { \
2989return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \
2991#define ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG(temp) \
2992template <typename T1, typename T2, typename T3, typename T4, typename T5> \
2993inline MessageBuilder& operator<<(const temp<T1, T2, T3, T4, T5>& template_inst) { \
2994return writeIterator(template_inst.begin(), template_inst.end(), template_inst.size()); \
2997#if defined(ELPP_STL_LOGGING)
3005 template <
class T,
class Container>
3006 inline MessageBuilder&
operator<<(
const std::queue<T, Container>& queue_) {
3007 base::workarounds::IterableQueue<T, Container> iterableQueue_ =
3008 static_cast<base::workarounds::IterableQueue<T, Container>
>(queue_);
3009 return writeIterator(iterableQueue_.begin(), iterableQueue_.end(), iterableQueue_.size());
3011 template <
class T,
class Container>
3012 inline MessageBuilder&
operator<<(
const std::stack<T, Container>& stack_) {
3013 base::workarounds::IterableStack<T, Container> iterableStack_ =
3014 static_cast<base::workarounds::IterableStack<T, Container>
>(stack_);
3015 return writeIterator(iterableStack_.begin(), iterableStack_.end(), iterableStack_.size());
3017 template <
class T,
class Container,
class Comparator>
3018 inline MessageBuilder&
operator<<(
const std::priority_queue<T, Container, Comparator>& priorityQueue_) {
3019 base::workarounds::IterablePriorityQueue<T, Container, Comparator> iterablePriorityQueue_ =
3020 static_cast<base::workarounds::IterablePriorityQueue<T, Container, Comparator>
>(priorityQueue_);
3021 return writeIterator(iterablePriorityQueue_.begin(), iterablePriorityQueue_.end(), iterablePriorityQueue_.size());
3023 template <
class First,
class Second>
3024 MessageBuilder&
operator<<(
const std::pair<First, Second>& pair_) {
3026 operator << (static_cast<First>(pair_.first));
3028 operator << (static_cast<Second>(pair_.second));
3032 template <std::
size_t Size>
3033 MessageBuilder&
operator<<(
const std::bitset<Size>& bitset_) {
3039# if defined(ELPP_LOG_STD_ARRAY)
3040 template <
class T, std::
size_t Size>
3041 inline MessageBuilder&
operator<<(
const std::array<T, Size>& array) {
3042 return writeIterator(array.begin(), array.end(), array.size());
3045# if defined(ELPP_LOG_UNORDERED_MAP)
3049# if defined(ELPP_LOG_UNORDERED_SET)
3054#if defined(ELPP_QT_LOGGING)
3055 inline MessageBuilder&
operator<<(
const QString& msg) {
3056# if defined(ELPP_UNICODE)
3057 m_logger->stream() << msg.toStdWString();
3059 m_logger->stream() << msg.toStdString();
3063 inline MessageBuilder&
operator<<(
const QByteArray& msg) {
3066 inline MessageBuilder&
operator<<(
const QStringRef& msg) {
3069 inline MessageBuilder&
operator<<(qint64 msg) {
3070# if defined(ELPP_UNICODE)
3071 m_logger->stream() << QString::number(msg).toStdWString();
3073 m_logger->stream() << QString::number(msg).toStdString();
3077 inline MessageBuilder&
operator<<(quint64 msg) {
3078# if defined(ELPP_UNICODE)
3079 m_logger->stream() << QString::number(msg).toStdWString();
3081 m_logger->stream() << QString::number(msg).toStdString();
3085 inline MessageBuilder&
operator<<(QChar msg) {
3086 m_logger->stream() << msg.toLatin1();
3089 inline MessageBuilder&
operator<<(
const QLatin1String& msg) {
3090 m_logger->stream() << msg.latin1();
3099 template <
typename First,
typename Second>
3100 MessageBuilder&
operator<<(
const QPair<First, Second>& pair_) {
3102 operator << (static_cast<First>(pair_.first));
3104 operator << (static_cast<Second>(pair_.second));
3108 template <
typename K,
typename V>
3109 MessageBuilder&
operator<<(
const QMap<K, V>& map_) {
3111 QList<K> keys = map_.keys();
3112 typename QList<K>::const_iterator begin = keys.begin();
3113 typename QList<K>::const_iterator end = keys.end();
3114 int max_ =
static_cast<int>(base::consts::kMaxLogPerContainer);
3115 for (
int index_ = 0; begin != end && index_ < max_; ++index_, ++begin) {
3117 operator << (static_cast<K>(*begin));
3119 operator << (static_cast<V>(map_.value(*begin)));
3121 m_logger->stream() << ((index_ < keys.size() -1) ? m_containerLogSeperator :
ELPP_LITERAL(
""));
3129 template <
typename K,
typename V>
3130 inline MessageBuilder&
operator<<(
const QMultiMap<K, V>& map_) {
3134 template <
typename K,
typename V>
3135 MessageBuilder&
operator<<(
const QHash<K, V>& hash_) {
3137 QList<K> keys = hash_.keys();
3138 typename QList<K>::const_iterator begin = keys.begin();
3139 typename QList<K>::const_iterator end = keys.end();
3140 int max_ =
static_cast<int>(base::consts::kMaxLogPerContainer);
3141 for (
int index_ = 0; begin != end && index_ < max_; ++index_, ++begin) {
3143 operator << (static_cast<K>(*begin));
3145 operator << (static_cast<V>(hash_.value(*begin)));
3147 m_logger->stream() << ((index_ < keys.size() -1) ? m_containerLogSeperator :
ELPP_LITERAL(
""));
3155 template <
typename K,
typename V>
3156 inline MessageBuilder&
operator<<(
const QMultiHash<K, V>& multiHash_) {
3157 operator << (
static_cast<QHash<K, V>
>(multiHash_));
3161#if defined(ELPP_BOOST_LOGGING)
3180#define MAKE_CONTAINERELPP_FRIENDLY(ContainerType, SizeMethod, ElementInstance) \
3181el::base::type::ostream_t& operator<<(el::base::type::ostream_t& ss, const ContainerType& container) {\
3182const el::base::type::char_t* sep = ELPP->hasFlag(el::LoggingFlag::NewLineForContainer) ? \
3183ELPP_LITERAL("\n ") : ELPP_LITERAL(", ");\
3184ContainerType::const_iterator elem = container.begin();\
3185ContainerType::const_iterator endElem = container.end();\
3186std::size_t size_ = container.SizeMethod; \
3187ss << ELPP_LITERAL("[");\
3188for (std::size_t i = 0; elem != endElem && i < el::base::consts::kMaxLogPerContainer; ++i, ++elem) { \
3189ss << ElementInstance;\
3190ss << ((i < size_ - 1) ? sep : ELPP_LITERAL(""));\
3192if (elem != endElem) {\
3193ss << ELPP_LITERAL("...");\
3195ss << ELPP_LITERAL("]");\
3198#if defined(ELPP_WXWIDGETS_LOGGING)
3200# define ELPP_WX_PTR_ENABLED(ContainerType) MAKE_CONTAINERELPP_FRIENDLY(ContainerType, size(), *(*elem))
3201# define ELPP_WX_ENABLED(ContainerType) MAKE_CONTAINERELPP_FRIENDLY(ContainerType, size(), (*elem))
3202# define ELPP_WX_HASH_MAP_ENABLED(ContainerType) MAKE_CONTAINERELPP_FRIENDLY(ContainerType, size(), \
3203ELPP_LITERAL("(") << elem->first << ELPP_LITERAL(", ") << elem->second << ELPP_LITERAL(")")
3205# define ELPP_WX_PTR_ENABLED(ContainerType)
3206# define ELPP_WX_ENABLED(ContainerType)
3207# define ELPP_WX_HASH_MAP_ENABLED(ContainerType)
3210 template <
class Class>
3212#undef ELPP_SIMPLE_LOG
3213#undef ELPP_ITERATOR_CONTAINER_LOG_ONE_ARG
3214#undef ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG
3215#undef ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG
3216#undef ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG
3217#undef ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG
3222 template<
class Iterator>
3229 if (begin_ != end_) {
3249 template <
typename T>
3254 inline operator bool() {
3278#if ELPP_LOGGING_ENABLED
3286 inline operator bool() {
3290 Writer& construct(
Logger* logger,
bool needLock =
true);
3291 Writer& construct(
int count,
const char* loggerIds, ...);
3292 Writer& construct(
const char *loggerId);
3319 base::
Writer(level, color, file, line, func, dispatchAction, verboseLevel) {
3326#if ELPP_VARIADIC_TEMPLATES_SUPPORTED
3327template <
typename T,
typename... Args>
3328void Logger::log_(Level level,
int vlevel,
const char*
s,
const T&
value,
const Args&... args) {
3329 base::MessageBuilder
b;
3332 if (*
s == base::consts::kFormatSpecifierChar) {
3333 if (*(
s + 1) == base::consts::kFormatSpecifierChar) {
3336 if (*(
s + 1) == base::consts::kFormatSpecifierCharValue) {
3339 log_(level, vlevel, ++
s,
args...);
3346 ELPP_INTERNAL_ERROR(
"Too many arguments provided. Unable to handle. Please provide more format specifiers",
false);
3348template <
typename T>
3349void Logger::log_(Level level,
int vlevel,
const T&
log) {
3350 if (level == Level::Verbose) {
3351 if (
ELPP->vRegistry()->allowed(vlevel, __FILE__)) {
3352 base::Writer(Level::Verbose, Color::Default,
"FILE", 0,
"FUNCTION",
3353 base::DispatchAction::NormalLog, vlevel).construct(
this,
false) <<
log;
3359 base::Writer(level, Color::Default,
"FILE", 0,
"FUNCTION").construct(
this,
false) <<
log;
3362template <
typename T,
typename...
Args>
3363inline void Logger::log(Level level,
const char*
s,
const T&
value,
const Args&... args) {
3367template <
typename T>
3368inline void Logger::log(Level level,
const T&
log) {
3370 log_(level, 0,
log);
3372# if ELPP_VERBOSE_LOG
3373template <
typename T,
typename...
Args>
3374inline void Logger::verbose(
int vlevel,
const char*
s,
const T&
value,
const Args&... args) {
3378template <
typename T>
3379inline void Logger::verbose(
int vlevel,
const T&
log) {
3384template <
typename T,
typename...
Args>
3385inline void Logger::verbose(
int,
const char*,
const T&,
const Args&...) {
3388template <
typename T>
3389inline void Logger::verbose(
int,
const T&) {
3393# define LOGGER_LEVEL_WRITERS(FUNCTION_NAME, LOG_LEVEL)\
3394template <typename T, typename... Args>\
3395inline void Logger::FUNCTION_NAME(const char* s, const T& value, const Args&... args) {\
3396log(LOG_LEVEL, s, value, args...);\
3398template <typename T>\
3399inline void Logger::FUNCTION_NAME(const T& value) {\
3400log(LOG_LEVEL, value);\
3402# define LOGGER_LEVEL_WRITERS_DISABLED(FUNCTION_NAME, LOG_LEVEL)\
3403template <typename T, typename... Args>\
3404inline void Logger::FUNCTION_NAME(const char*, const T&, const Args&...) {\
3407template <typename T>\
3408inline void Logger::FUNCTION_NAME(const T&) {\
3413LOGGER_LEVEL_WRITERS(
info, Level::Info)
3415LOGGER_LEVEL_WRITERS_DISABLED(
info, Level::Info)
3418LOGGER_LEVEL_WRITERS(debug, Level::Debug)
3420LOGGER_LEVEL_WRITERS_DISABLED(debug, Level::Debug)
3422# if ELPP_WARNING_LOG
3423LOGGER_LEVEL_WRITERS(warn, Level::Warning)
3425LOGGER_LEVEL_WRITERS_DISABLED(warn, Level::Warning)
3428LOGGER_LEVEL_WRITERS(error, Level::Error)
3430LOGGER_LEVEL_WRITERS_DISABLED(error, Level::Error)
3433LOGGER_LEVEL_WRITERS(fatal, Level::Fatal)
3435LOGGER_LEVEL_WRITERS_DISABLED(fatal, Level::Fatal)
3438LOGGER_LEVEL_WRITERS(trace, Level::Trace)
3440LOGGER_LEVEL_WRITERS_DISABLED(trace, Level::Trace)
3442# undef LOGGER_LEVEL_WRITERS
3443# undef LOGGER_LEVEL_WRITERS_DISABLED
3445#if ELPP_COMPILER_MSVC
3446# define ELPP_VARIADIC_FUNC_MSVC(variadicFunction, variadicArgs) variadicFunction variadicArgs
3447# define ELPP_VARIADIC_FUNC_MSVC_RUN(variadicFunction, ...) ELPP_VARIADIC_FUNC_MSVC(variadicFunction, (__VA_ARGS__))
3448# define el_getVALength(...) ELPP_VARIADIC_FUNC_MSVC_RUN(el_resolveVALength, 0, ## __VA_ARGS__,\
344910, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
3451# if ELPP_COMPILER_CLANG
3452# define el_getVALength(...) el_resolveVALength(0, __VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
3454# define el_getVALength(...) el_resolveVALength(0, ## __VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
3457#define el_resolveVALength(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
3458#define ELPP_WRITE_LOG(writer, level, dispatchAction, ...) \
3459writer(level, el::Color::Default, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
3460#define ELPP_WRITE_LOG_IF(writer, condition, level, dispatchAction, ...) if (condition) \
3461writer(level, el::Color::Default, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
3462#define ELPP_WRITE_LOG_EVERY_N(writer, occasion, level, dispatchAction, ...) \
3463ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion) && \
3464writer(level, el::Color::Default, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
3465#define ELPP_WRITE_LOG_AFTER_N(writer, n, level, dispatchAction, ...) \
3466ELPP->validateAfterNCounter(__FILE__, __LINE__, n) && \
3467writer(level, el::Color::Default, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
3468#define ELPP_WRITE_LOG_N_TIMES(writer, n, level, dispatchAction, ...) \
3469ELPP->validateNTimesCounter(__FILE__, __LINE__, n) && \
3470writer(level, el::Color::Default, __FILE__, __LINE__, ELPP_FUNC, dispatchAction).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
3471#if defined(ELPP_FEATURE_ALL) || defined(ELPP_FEATURE_PERFORMANCE_TRACKING)
3472class PerformanceTrackingData {
3474 enum class DataType : base::type::EnumType {
3475 Checkpoint = 1, Complete = 2
3478 explicit PerformanceTrackingData(DataType dataType) : m_performanceTracker(
nullptr),
3479 m_dataType(dataType), m_firstCheckpoint(
false), m_file(
""), m_line(0), m_func(
"") {}
3480 inline const std::string* blockName(
void)
const;
3481 inline const struct timeval* startTime(
void)
const;
3482 inline const struct timeval* endTime(
void)
const;
3483 inline const struct timeval* lastCheckpointTime(
void)
const;
3484 inline const base::PerformanceTracker* performanceTracker(
void)
const {
3485 return m_performanceTracker;
3487 inline PerformanceTrackingData::DataType dataType(
void)
const {
3490 inline bool firstCheckpoint(
void)
const {
3491 return m_firstCheckpoint;
3493 inline std::string checkpointId(
void)
const {
3494 return m_checkpointId;
3496 inline const char* file(
void)
const {
3499 inline base::type::LineNumber line(
void)
const {
3502 inline const char* func(
void)
const {
3505 inline const base::type::string_t* formattedTimeTaken()
const {
3506 return &m_formattedTimeTaken;
3508 inline const std::string& loggerId(
void)
const;
3510 base::PerformanceTracker* m_performanceTracker;
3511 base::type::string_t m_formattedTimeTaken;
3512 PerformanceTrackingData::DataType m_dataType;
3513 bool m_firstCheckpoint;
3514 std::string m_checkpointId;
3516 base::type::LineNumber m_line;
3518 inline void init(base::PerformanceTracker* performanceTracker,
bool firstCheckpoint =
false) {
3519 m_performanceTracker = performanceTracker;
3520 m_firstCheckpoint = firstCheckpoint;
3523 friend class el::base::PerformanceTracker;
3528class PerformanceTracker :
public base::threading::ThreadSafe,
public Loggable {
3530 PerformanceTracker(
const std::string& blockName,
3531 base::TimestampUnit timestampUnit = base::TimestampUnit::Millisecond,
3532 const std::string& loggerId = std::string(el::base::consts::kPerformanceLoggerId),
3533 bool scopedLog =
true, Level level = base::consts::kPerformanceTrackerDefaultLevel);
3535 PerformanceTracker(
const PerformanceTracker& t) :
3536 m_blockName(
t.m_blockName), m_timestampUnit(
t.m_timestampUnit), m_loggerId(
t.m_loggerId), m_scopedLog(
t.m_scopedLog),
3537 m_level(
t.m_level), m_hasChecked(
t.m_hasChecked), m_lastCheckpointId(
t.m_lastCheckpointId), m_enabled(
t.m_enabled),
3538 m_startTime(
t.m_startTime), m_endTime(
t.m_endTime), m_lastCheckpointTime(
t.m_lastCheckpointTime) {
3540 virtual ~PerformanceTracker(
void);
3542 void checkpoint(
const std::string&
id = std::string(),
const char* file = __FILE__,
3543 base::type::LineNumber line = __LINE__,
3544 const char* func =
"");
3545 inline Level level(
void)
const {
3549 std::string m_blockName;
3550 base::TimestampUnit m_timestampUnit;
3551 std::string m_loggerId;
3555 std::string m_lastCheckpointId;
3557 struct timeval m_startTime, m_endTime, m_lastCheckpointTime;
3559 PerformanceTracker(
void);
3561 friend class el::PerformanceTrackingData;
3562 friend class base::DefaultPerformanceTrackingCallback;
3564 const inline base::type::string_t getFormattedTimeTaken()
const {
3565 return getFormattedTimeTaken(m_startTime);
3568 const base::type::string_t getFormattedTimeTaken(
struct timeval startTime)
const;
3571 os << getFormattedTimeTaken();
3574class DefaultPerformanceTrackingCallback :
public PerformanceTrackingCallback {
3576 void handle(
const PerformanceTrackingData*
data) {
3578 base::type::stringstream_t ss;
3579 if (m_data->dataType() == PerformanceTrackingData::DataType::Complete) {
3584 if (!m_data->checkpointId().empty()) {
3588 *m_data->performanceTracker();
3589 if (!
ELPP->hasFlag(LoggingFlag::DisablePerformanceTrackingCheckpointComparison)
3590 && m_data->performanceTracker()->m_hasChecked) {
3592 if (m_data->performanceTracker()->m_lastCheckpointId.empty()) {
3595 ss <<
ELPP_LITERAL(
"checkpoint '") << m_data->performanceTracker()->m_lastCheckpointId.c_str() <<
ELPP_LITERAL(
"'");
3602 const std::string
str = ss.str();
3603 el::base::Writer(m_data->performanceTracker()->level(), m_data->file(), m_data->line(), m_data->func()).construct(1,
3604 m_data->loggerId().c_str()) <<
str;
3607 const PerformanceTrackingData* m_data;
3610inline const std::string* PerformanceTrackingData::blockName()
const {
3611 return const_cast<const std::string*
>(&m_performanceTracker->m_blockName);
3613inline const struct timeval* PerformanceTrackingData::startTime()
const {
3614 return const_cast<const struct timeval*
>(&m_performanceTracker->m_startTime);
3616inline const struct timeval* PerformanceTrackingData::endTime()
const {
3617 return const_cast<const struct timeval*
>(&m_performanceTracker->m_endTime);
3619inline const struct timeval* PerformanceTrackingData::lastCheckpointTime()
const {
3620 return const_cast<const struct timeval*
>(&m_performanceTracker->m_lastCheckpointTime);
3622inline const std::string& PerformanceTrackingData::loggerId(
void)
const {
3623 return m_performanceTracker->m_loggerId;
3629#if defined(ELPP_FEATURE_ALL) || defined(ELPP_FEATURE_CRASH_LOG)
3630class StackTrace : base::NoCopy {
3632 static const unsigned int kMaxStack = 64;
3633 static const unsigned int kStackStart = 2;
3634 class StackTraceEntry {
3636 StackTraceEntry(std::size_t index,
const std::string& loc,
const std::string& demang,
const std::string&
hex,
3637 const std::string& addr);
3638 StackTraceEntry(std::size_t index,
const std::string& loc) :
3642 std::size_t m_index;
3643 std::string m_location;
3644 std::string m_demangled;
3647 friend std::ostream&
operator<<(std::ostream& ss,
const StackTraceEntry&
si);
3650 StackTraceEntry(
void);
3657 virtual ~StackTrace(
void) {
3660 inline std::vector<StackTraceEntry>& getLatestStack(
void) {
3664 friend std::ostream&
operator<<(std::ostream& os,
const StackTrace& st);
3667 std::vector<StackTraceEntry> m_stack;
3669 void generateNew(
void);
3672class CrashHandler : base::NoCopy {
3674 typedef void (*Handler)(
int);
3676 explicit CrashHandler(
bool useDefault);
3677 explicit CrashHandler(
const Handler& cHandler) {
3678 setHandler(cHandler);
3680 void setHandler(
const Handler& cHandler);
3693extern base::debug::CrashHandler elCrashHandler;
3694#define MAKE_LOGGABLE(ClassType, ClassInstance, OutputStreamInstance) \
3695el::base::type::ostream_t& operator<<(el::base::type::ostream_t& OutputStreamInstance, const ClassType& ClassInstance)
3700#if defined(ELPP_SYSLOG)
3701 openlog(processIdent, options, facility);
3709#if defined(ELPP_SYSLOG)
3714#define ELPP_INITIALIZE_SYSLOG(id, opt, fac) el::SysLogInitializer elSyslogInit(id, opt, fac)
3727 static inline void setArgs(
int argc,
char** argv) {
3728 ELPP->setApplicationArguments(argc, argv);
3731 static inline void setArgs(
int argc,
const char** argv) {
3732 ELPP->setApplicationArguments(argc,
const_cast<char**
>(argv));
3741#if defined(ELPP_FEATURE_ALL) || defined(ELPP_FEATURE_CRASH_LOG)
3745 static inline void setCrashHandler(
const el::base::debug::CrashHandler::Handler& crashHandler) {
3750 static void crashAbort(
int sig,
const char* sourceFile =
"",
unsigned int long line = 0);
3756 static void logCrashReason(
int sig,
bool stackTraceIfAvailable =
false,
3757 Level level = Level::Fatal,
const char* logger = base::consts::kDefaultLoggerId);
3761 static inline void installPreRollOutCallback(const PreRollOutCallback& callback) {
3762 ELPP->setPreRollOutCallback(callback);
3766 ELPP->unsetPreRollOutCallback();
3769 template <
typename T>
3771 return ELPP->installLogDispatchCallback<
T>(
id);
3774 template <
typename T>
3776 ELPP->uninstallLogDispatchCallback<
T>(
id);
3778 template <
typename T>
3780 return ELPP->logDispatchCallback<
T>(
id);
3782#if defined(ELPP_FEATURE_ALL) || defined(ELPP_FEATURE_PERFORMANCE_TRACKING)
3784 template <
typename T>
3785 static inline bool installPerformanceTrackingCallback(
const std::string&
id) {
3786 return ELPP->installPerformanceTrackingCallback<
T>(
id);
3789 template <
typename T>
3790 static inline void uninstallPerformanceTrackingCallback(
const std::string&
id) {
3791 ELPP->uninstallPerformanceTrackingCallback<
T>(
id);
3793 template <
typename T>
3794 static inline T* performanceTrackingCallback(
const std::string&
id) {
3795 return ELPP->performanceTrackingCallback<
T>(
id);
3799 template <typename T>
3803 if (logger ==
nullptr) {
3804 return std::string();
3807 b.initialize(logger);
3810#if defined(ELPP_UNICODE)
3811 std::string
s = std::string(logger->
stream().str().begin(), logger->
stream().str().end());
3813 std::string
s = logger->
stream().str();
3821 return ELPP->commandLineArgs();
3826 ELPP->m_customFormatSpecifiers.reserve(size);
3830 ELPP->installCustomFormatSpecifier(customFormatSpecifier);
3834 return ELPP->uninstallCustomFormatSpecifier(formatSpecifier);
3838 return ELPP->hasCustomFormatSpecifier(formatSpecifier);
3841 if (
ELPP ==
nullptr || logger ==
nullptr)
return;
3851 static Logger*
getLogger(
const std::string& identity,
bool registerIfNotAvailable =
true);
3855 template <
typename T>
3857 return ELPP->registeredLoggers()->installLoggerRegistrationCallback<
T>(
id);
3860 template <
typename T>
3862 ELPP->registeredLoggers()->uninstallLoggerRegistrationCallback<
T>(
id);
3864 template <
typename T>
3866 return ELPP->registeredLoggers()->loggerRegistrationCallback<
T>(
id);
3870 static bool unregisterLogger(
const std::string& identity);
3872 static bool hasLogger(
const std::string& identity);
3876 static Logger* reconfigureLogger(
const std::string& identity,
const Configurations& configurations);
3879 const std::string&
value);
3881 static void reconfigureAllLoggers(
const Configurations& configurations);
3888 const std::string&
value);
3890 static void setDefaultConfigurations(
const Configurations& configurations,
3891 bool reconfigureExistingLoggers =
false);
3900 static std::vector<std::string>* populateAllLoggerIds(std::vector<std::string>* targetList);
3902 static void configureFromGlobal(
const char* globalConfigurationFilePath);
3907 static bool configureFromArg(
const char* argKey);
3909 static void flushAll(
void);
3912 ELPP->addFlag(flag);
3916 ELPP->removeFlag(flag);
3920 return ELPP->hasFlag(flag);
3948 ELPP->setLoggingLevel(level);
3955 static void setVModules(
const char* modules);
3957 static void setCategories(
const char* categories,
bool clear =
true);
3959 static std::string getCategories();
3961 static void clearVModules(
void);
3963 static void clearCategories(
void);
3965 static void setFilenameCommonPrefix(
const std::string &prefix);
3967 static const std::string &getFilenameCommonPrefix();
3972 static const std::string
version(
void);
3980#define VLOG_IS_ON(verboseLevel) (ELPP->vRegistry()->allowed(verboseLevel, __FILE__))
3983#undef TIMED_SCOPE_IF
3987#if defined(ELPP_PERFORMANCE_MICROSECONDS)
3988# define ELPP_MIN_UNIT el::base::TimestampUnit::Microsecond
3990# define ELPP_MIN_UNIT el::base::TimestampUnit::Millisecond
3999#define TIMED_SCOPE_IF(obj, blockname, condition) el::base::type::PerformanceTrackerPtr obj( condition ? \
4000 new el::base::PerformanceTracker(blockname, ELPP_MIN_UNIT) : nullptr )
4001#define TIMED_SCOPE(obj, blockname) TIMED_SCOPE_IF(obj, blockname, true)
4002#define TIMED_BLOCK(obj, blockName) for (struct { int i; el::base::type::PerformanceTrackerPtr timer; } obj = { 0, \
4003 el::base::type::PerformanceTrackerPtr(new el::base::PerformanceTracker(blockName, ELPP_MIN_UNIT)) }; obj.i < 1; ++obj.i)
4010#define TIMED_FUNC_IF(obj,condition) TIMED_SCOPE_IF(obj, ELPP_FUNC, condition)
4011#define TIMED_FUNC(obj) TIMED_SCOPE(obj, ELPP_FUNC)
4012#undef PERFORMANCE_CHECKPOINT
4013#undef PERFORMANCE_CHECKPOINT_WITH_ID
4014#define PERFORMANCE_CHECKPOINT(obj) obj->checkpoint(std::string(), __FILE__, __LINE__, ELPP_FUNC)
4015#define PERFORMANCE_CHECKPOINT_WITH_ID(obj, id) obj->checkpoint(id, __FILE__, __LINE__, ELPP_FUNC)
4017#undef ELPP_COUNTER_POS
4019#define ELPP_COUNTER (ELPP->hitCounters()->getCounter(__FILE__, __LINE__))
4021#define ELPP_COUNTER_POS (ELPP_COUNTER == nullptr ? -1 : ELPP_COUNTER->hitCounts())
4046#undef CWARNING_EVERY_N
4047#undef CDEBUG_EVERY_N
4048#undef CERROR_EVERY_N
4049#undef CFATAL_EVERY_N
4050#undef CTRACE_EVERY_N
4051#undef CVERBOSE_EVERY_N
4053#undef CWARNING_AFTER_N
4054#undef CDEBUG_AFTER_N
4055#undef CERROR_AFTER_N
4056#undef CFATAL_AFTER_N
4057#undef CTRACE_AFTER_N
4058#undef CVERBOSE_AFTER_N
4060#undef CWARNING_N_TIMES
4061#undef CDEBUG_N_TIMES
4062#undef CERROR_N_TIMES
4063#undef CFATAL_N_TIMES
4064#undef CTRACE_N_TIMES
4065#undef CVERBOSE_N_TIMES
4068# define CINFO(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Info, dispatchAction, __VA_ARGS__)
4070# define CINFO(writer, dispatchAction, ...) el::base::NullWriter()
4073# define CWARNING(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Warning, dispatchAction, __VA_ARGS__)
4075# define CWARNING(writer, dispatchAction, ...) el::base::NullWriter()
4078# define CDEBUG(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Debug, dispatchAction, __VA_ARGS__)
4080# define CDEBUG(writer, dispatchAction, ...) el::base::NullWriter()
4083# define CERROR(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Error, dispatchAction, __VA_ARGS__)
4085# define CERROR(writer, dispatchAction, ...) el::base::NullWriter()
4088# define CFATAL(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Fatal, dispatchAction, __VA_ARGS__)
4090# define CFATAL(writer, dispatchAction, ...) el::base::NullWriter()
4093# define CTRACE(writer, dispatchAction, ...) ELPP_WRITE_LOG(writer, el::Level::Trace, dispatchAction, __VA_ARGS__)
4095# define CTRACE(writer, dispatchAction, ...) el::base::NullWriter()
4098# define CVERBOSE(writer, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel)) writer(\
4099el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
4101# define CVERBOSE(writer, vlevel, dispatchAction, ...) el::base::NullWriter()
4105# define CINFO_IF(writer, condition_, dispatchAction, ...) \
4106ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Info, dispatchAction, __VA_ARGS__)
4108# define CINFO_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
4111# define CWARNING_IF(writer, condition_, dispatchAction, ...)\
4112ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Warning, dispatchAction, __VA_ARGS__)
4114# define CWARNING_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
4117# define CDEBUG_IF(writer, condition_, dispatchAction, ...)\
4118ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Debug, dispatchAction, __VA_ARGS__)
4120# define CDEBUG_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
4123# define CERROR_IF(writer, condition_, dispatchAction, ...)\
4124ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Error, dispatchAction, __VA_ARGS__)
4126# define CERROR_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
4129# define CFATAL_IF(writer, condition_, dispatchAction, ...)\
4130ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Fatal, dispatchAction, __VA_ARGS__)
4132# define CFATAL_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
4135# define CTRACE_IF(writer, condition_, dispatchAction, ...)\
4136ELPP_WRITE_LOG_IF(writer, (condition_), el::Level::Trace, dispatchAction, __VA_ARGS__)
4138# define CTRACE_IF(writer, condition_, dispatchAction, ...) el::base::NullWriter()
4141# define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) if (VLOG_IS_ON(vlevel) && (condition_)) writer( \
4142el::Level::Verbose, __FILE__, __LINE__, ELPP_FUNC, dispatchAction, vlevel).construct(el_getVALength(__VA_ARGS__), __VA_ARGS__)
4144# define CVERBOSE_IF(writer, condition_, vlevel, dispatchAction, ...) el::base::NullWriter()
4148# define CINFO_EVERY_N(writer, occasion, dispatchAction, ...)\
4149ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Info, dispatchAction, __VA_ARGS__)
4151# define CINFO_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()
4154# define CWARNING_EVERY_N(writer, occasion, dispatchAction, ...)\
4155ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Warning, dispatchAction, __VA_ARGS__)
4157# define CWARNING_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()
4160# define CDEBUG_EVERY_N(writer, occasion, dispatchAction, ...)\
4161ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Debug, dispatchAction, __VA_ARGS__)
4163# define CDEBUG_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()
4166# define CERROR_EVERY_N(writer, occasion, dispatchAction, ...)\
4167ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Error, dispatchAction, __VA_ARGS__)
4169# define CERROR_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()
4172# define CFATAL_EVERY_N(writer, occasion, dispatchAction, ...)\
4173ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Fatal, dispatchAction, __VA_ARGS__)
4175# define CFATAL_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()
4178# define CTRACE_EVERY_N(writer, occasion, dispatchAction, ...)\
4179ELPP_WRITE_LOG_EVERY_N(writer, occasion, el::Level::Trace, dispatchAction, __VA_ARGS__)
4181# define CTRACE_EVERY_N(writer, occasion, dispatchAction, ...) el::base::NullWriter()
4184# define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, ...)\
4185CVERBOSE_IF(writer, ELPP->validateEveryNCounter(__FILE__, __LINE__, occasion), vlevel, dispatchAction, __VA_ARGS__)
4187# define CVERBOSE_EVERY_N(writer, occasion, vlevel, dispatchAction, ...) el::base::NullWriter()
4191# define CINFO_AFTER_N(writer, n, dispatchAction, ...)\
4192ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Info, dispatchAction, __VA_ARGS__)
4194# define CINFO_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()
4197# define CWARNING_AFTER_N(writer, n, dispatchAction, ...)\
4198ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Warning, dispatchAction, __VA_ARGS__)
4200# define CWARNING_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()
4203# define CDEBUG_AFTER_N(writer, n, dispatchAction, ...)\
4204ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Debug, dispatchAction, __VA_ARGS__)
4206# define CDEBUG_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()
4209# define CERROR_AFTER_N(writer, n, dispatchAction, ...)\
4210ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Error, dispatchAction, __VA_ARGS__)
4212# define CERROR_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()
4215# define CFATAL_AFTER_N(writer, n, dispatchAction, ...)\
4216ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Fatal, dispatchAction, __VA_ARGS__)
4218# define CFATAL_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()
4221# define CTRACE_AFTER_N(writer, n, dispatchAction, ...)\
4222ELPP_WRITE_LOG_AFTER_N(writer, n, el::Level::Trace, dispatchAction, __VA_ARGS__)
4224# define CTRACE_AFTER_N(writer, n, dispatchAction, ...) el::base::NullWriter()
4227# define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, ...)\
4228CVERBOSE_IF(writer, ELPP->validateAfterNCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)
4230# define CVERBOSE_AFTER_N(writer, n, vlevel, dispatchAction, ...) el::base::NullWriter()
4234# define CINFO_N_TIMES(writer, n, dispatchAction, ...)\
4235ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Info, dispatchAction, __VA_ARGS__)
4237# define CINFO_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()
4240# define CWARNING_N_TIMES(writer, n, dispatchAction, ...)\
4241ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Warning, dispatchAction, __VA_ARGS__)
4243# define CWARNING_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()
4246# define CDEBUG_N_TIMES(writer, n, dispatchAction, ...)\
4247ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Debug, dispatchAction, __VA_ARGS__)
4249# define CDEBUG_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()
4252# define CERROR_N_TIMES(writer, n, dispatchAction, ...)\
4253ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Error, dispatchAction, __VA_ARGS__)
4255# define CERROR_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()
4258# define CFATAL_N_TIMES(writer, n, dispatchAction, ...)\
4259ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Fatal, dispatchAction, __VA_ARGS__)
4261# define CFATAL_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()
4264# define CTRACE_N_TIMES(writer, n, dispatchAction, ...)\
4265ELPP_WRITE_LOG_N_TIMES(writer, n, el::Level::Trace, dispatchAction, __VA_ARGS__)
4267# define CTRACE_N_TIMES(writer, n, dispatchAction, ...) el::base::NullWriter()
4270# define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, ...)\
4271CVERBOSE_IF(writer, ELPP->validateNTimesCounter(__FILE__, __LINE__, n), vlevel, dispatchAction, __VA_ARGS__)
4273# define CVERBOSE_N_TIMES(writer, n, vlevel, dispatchAction, ...) el::base::NullWriter()
4283#undef CLOG_VERBOSE_IF
4292#define CLOG(LEVEL, ...)\
4293C##LEVEL(el::base::Writer, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4294#define CVLOG(vlevel, ...) CVERBOSE(el::base::Writer, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4296#define CLOG_IF(condition, LEVEL, ...)\
4297C##LEVEL##_IF(el::base::Writer, condition, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4298#define CVLOG_IF(condition, vlevel, ...)\
4299CVERBOSE_IF(el::base::Writer, condition, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4301#define CLOG_EVERY_N(n, LEVEL, ...)\
4302C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4303#define CVLOG_EVERY_N(n, vlevel, ...)\
4304CVERBOSE_EVERY_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4305#define CLOG_AFTER_N(n, LEVEL, ...)\
4306C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4307#define CVLOG_AFTER_N(n, vlevel, ...)\
4308CVERBOSE_AFTER_N(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4309#define CLOG_N_TIMES(n, LEVEL, ...)\
4310C##LEVEL##_N_TIMES(el::base::Writer, n, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4311#define CVLOG_N_TIMES(n, vlevel, ...)\
4312CVERBOSE_N_TIMES(el::base::Writer, n, vlevel, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4327#undef ELPP_CURR_FILE_LOGGER_ID
4328#if defined(ELPP_DEFAULT_LOGGER)
4329# define ELPP_CURR_FILE_LOGGER_ID ELPP_DEFAULT_LOGGER
4331# define ELPP_CURR_FILE_LOGGER_ID el::base::consts::kDefaultLoggerId
4334#define ELPP_TRACE CLOG(TRACE, ELPP_CURR_FILE_LOGGER_ID)
4336#define LOG(LEVEL) CLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4337#define VLOG(vlevel) CVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID)
4339#define LOG_IF(condition, LEVEL) CLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4340#define VLOG_IF(condition, vlevel) CVLOG_IF(condition, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4342#define LOG_EVERY_N(n, LEVEL) CLOG_EVERY_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4343#define VLOG_EVERY_N(n, vlevel) CVLOG_EVERY_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4344#define LOG_AFTER_N(n, LEVEL) CLOG_AFTER_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4345#define VLOG_AFTER_N(n, vlevel) CVLOG_AFTER_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4346#define LOG_N_TIMES(n, LEVEL) CLOG_N_TIMES(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4347#define VLOG_N_TIMES(n, vlevel) CVLOG_N_TIMES(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4357#define CPLOG(LEVEL, ...)\
4358C##LEVEL(el::base::PErrorWriter, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4359#define CPLOG_IF(condition, LEVEL, ...)\
4360C##LEVEL##_IF(el::base::PErrorWriter, condition, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4361#define DCPLOG(LEVEL, ...)\
4362if (ELPP_DEBUG_LOG) C##LEVEL(el::base::PErrorWriter, el::base::DispatchAction::NormalLog, __VA_ARGS__)
4363#define DCPLOG_IF(condition, LEVEL, ...)\
4364C##LEVEL##_IF(el::base::PErrorWriter, (ELPP_DEBUG_LOG) && (condition), el::base::DispatchAction::NormalLog, __VA_ARGS__)
4365#define PLOG(LEVEL) CPLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4366#define PLOG_IF(condition, LEVEL) CPLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4367#define DPLOG(LEVEL) DCPLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4368#define DPLOG_IF(condition, LEVEL) DCPLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4372#undef CSYSLOG_EVERY_N
4373#undef CSYSLOG_AFTER_N
4374#undef CSYSLOG_N_TIMES
4377#undef SYSLOG_EVERY_N
4378#undef SYSLOG_AFTER_N
4379#undef SYSLOG_N_TIMES
4382#undef DCSYSLOG_EVERY_N
4383#undef DCSYSLOG_AFTER_N
4384#undef DCSYSLOG_N_TIMES
4387#undef DSYSLOG_EVERY_N
4388#undef DSYSLOG_AFTER_N
4389#undef DSYSLOG_N_TIMES
4390#if defined(ELPP_SYSLOG)
4391# define CSYSLOG(LEVEL, ...)\
4392C##LEVEL(el::base::Writer, el::base::DispatchAction::SysLog, __VA_ARGS__)
4393# define CSYSLOG_IF(condition, LEVEL, ...)\
4394C##LEVEL##_IF(el::base::Writer, condition, el::base::DispatchAction::SysLog, __VA_ARGS__)
4395# define CSYSLOG_EVERY_N(n, LEVEL, ...) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)
4396# define CSYSLOG_AFTER_N(n, LEVEL, ...) C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)
4397# define CSYSLOG_N_TIMES(n, LEVEL, ...) C##LEVEL##_N_TIMES(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)
4398# define SYSLOG(LEVEL) CSYSLOG(LEVEL, el::base::consts::kSysLogLoggerId)
4399# define SYSLOG_IF(condition, LEVEL) CSYSLOG_IF(condition, LEVEL, el::base::consts::kSysLogLoggerId)
4400# define SYSLOG_EVERY_N(n, LEVEL) CSYSLOG_EVERY_N(n, LEVEL, el::base::consts::kSysLogLoggerId)
4401# define SYSLOG_AFTER_N(n, LEVEL) CSYSLOG_AFTER_N(n, LEVEL, el::base::consts::kSysLogLoggerId)
4402# define SYSLOG_N_TIMES(n, LEVEL) CSYSLOG_N_TIMES(n, LEVEL, el::base::consts::kSysLogLoggerId)
4403# define DCSYSLOG(LEVEL, ...) if (ELPP_DEBUG_LOG) C##LEVEL(el::base::Writer, el::base::DispatchAction::SysLog, __VA_ARGS__)
4404# define DCSYSLOG_IF(condition, LEVEL, ...)\
4405C##LEVEL##_IF(el::base::Writer, (ELPP_DEBUG_LOG) && (condition), el::base::DispatchAction::SysLog, __VA_ARGS__)
4406# define DCSYSLOG_EVERY_N(n, LEVEL, ...)\
4407if (ELPP_DEBUG_LOG) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)
4408# define DCSYSLOG_AFTER_N(n, LEVEL, ...)\
4409if (ELPP_DEBUG_LOG) C##LEVEL##_AFTER_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)
4410# define DCSYSLOG_N_TIMES(n, LEVEL, ...)\
4411if (ELPP_DEBUG_LOG) C##LEVEL##_EVERY_N(el::base::Writer, n, el::base::DispatchAction::SysLog, __VA_ARGS__)
4412# define DSYSLOG(LEVEL) DCSYSLOG(LEVEL, el::base::consts::kSysLogLoggerId)
4413# define DSYSLOG_IF(condition, LEVEL) DCSYSLOG_IF(condition, LEVEL, el::base::consts::kSysLogLoggerId)
4414# define DSYSLOG_EVERY_N(n, LEVEL) DCSYSLOG_EVERY_N(n, LEVEL, el::base::consts::kSysLogLoggerId)
4415# define DSYSLOG_AFTER_N(n, LEVEL) DCSYSLOG_AFTER_N(n, LEVEL, el::base::consts::kSysLogLoggerId)
4416# define DSYSLOG_N_TIMES(n, LEVEL) DCSYSLOG_N_TIMES(n, LEVEL, el::base::consts::kSysLogLoggerId)
4418# define CSYSLOG(LEVEL, ...) el::base::NullWriter()
4419# define CSYSLOG_IF(condition, LEVEL, ...) el::base::NullWriter()
4420# define CSYSLOG_EVERY_N(n, LEVEL, ...) el::base::NullWriter()
4421# define CSYSLOG_AFTER_N(n, LEVEL, ...) el::base::NullWriter()
4422# define CSYSLOG_N_TIMES(n, LEVEL, ...) el::base::NullWriter()
4423# define SYSLOG(LEVEL) el::base::NullWriter()
4424# define SYSLOG_IF(condition, LEVEL) el::base::NullWriter()
4425# define SYSLOG_EVERY_N(n, LEVEL) el::base::NullWriter()
4426# define SYSLOG_AFTER_N(n, LEVEL) el::base::NullWriter()
4427# define SYSLOG_N_TIMES(n, LEVEL) el::base::NullWriter()
4428# define DCSYSLOG(LEVEL, ...) el::base::NullWriter()
4429# define DCSYSLOG_IF(condition, LEVEL, ...) el::base::NullWriter()
4430# define DCSYSLOG_EVERY_N(n, LEVEL, ...) el::base::NullWriter()
4431# define DCSYSLOG_AFTER_N(n, LEVEL, ...) el::base::NullWriter()
4432# define DCSYSLOG_N_TIMES(n, LEVEL, ...) el::base::NullWriter()
4433# define DSYSLOG(LEVEL) el::base::NullWriter()
4434# define DSYSLOG_IF(condition, LEVEL) el::base::NullWriter()
4435# define DSYSLOG_EVERY_N(n, LEVEL) el::base::NullWriter()
4436# define DSYSLOG_AFTER_N(n, LEVEL) el::base::NullWriter()
4437# define DSYSLOG_N_TIMES(n, LEVEL) el::base::NullWriter()
4448#undef DCVLOG_EVERY_N
4450#undef DCVLOG_AFTER_N
4452#undef DCVLOG_N_TIMES
4454#define DCLOG(LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG(LEVEL, __VA_ARGS__)
4455#define DCLOG_VERBOSE(vlevel, ...) if (ELPP_DEBUG_LOG) CLOG_VERBOSE(vlevel, __VA_ARGS__)
4456#define DCVLOG(vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG(vlevel, __VA_ARGS__)
4458#define DCLOG_IF(condition, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_IF(condition, LEVEL, __VA_ARGS__)
4459#define DCVLOG_IF(condition, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_IF(condition, vlevel, __VA_ARGS__)
4461#define DCLOG_EVERY_N(n, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_EVERY_N(n, LEVEL, __VA_ARGS__)
4462#define DCVLOG_EVERY_N(n, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_EVERY_N(n, vlevel, __VA_ARGS__)
4463#define DCLOG_AFTER_N(n, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_AFTER_N(n, LEVEL, __VA_ARGS__)
4464#define DCVLOG_AFTER_N(n, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_AFTER_N(n, vlevel, __VA_ARGS__)
4465#define DCLOG_N_TIMES(n, LEVEL, ...) if (ELPP_DEBUG_LOG) CLOG_N_TIMES(n, LEVEL, __VA_ARGS__)
4466#define DCVLOG_N_TIMES(n, vlevel, ...) if (ELPP_DEBUG_LOG) CVLOG_N_TIMES(n, vlevel, __VA_ARGS__)
4470#if !defined(ELPP_NO_DEBUG_MACROS)
4483#define DLOG(LEVEL) DCLOG(LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4484#define DVLOG(vlevel) DCVLOG(vlevel, ELPP_CURR_FILE_LOGGER_ID)
4486#define DLOG_IF(condition, LEVEL) DCLOG_IF(condition, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4487#define DVLOG_IF(condition, vlevel) DCVLOG_IF(condition, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4489#define DLOG_EVERY_N(n, LEVEL) DCLOG_EVERY_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4490#define DVLOG_EVERY_N(n, vlevel) DCVLOG_EVERY_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4491#define DLOG_AFTER_N(n, LEVEL) DCLOG_AFTER_N(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4492#define DVLOG_AFTER_N(n, vlevel) DCVLOG_AFTER_N(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4493#define DLOG_N_TIMES(n, LEVEL) DCLOG_N_TIMES(n, LEVEL, ELPP_CURR_FILE_LOGGER_ID)
4494#define DVLOG_N_TIMES(n, vlevel) DCVLOG_N_TIMES(n, vlevel, ELPP_CURR_FILE_LOGGER_ID)
4496#if !defined(ELPP_NO_CHECK_MACROS)
4507#undef CCHECK_NOTNULL
4508#undef CCHECK_STRCASEEQ
4509#undef CCHECK_STRCASENE
4520#undef CHECK_STRCASEEQ
4521#undef CHECK_STRCASENE
4522#define CCHECK(condition, ...) CLOG_IF(!(condition), FATAL, __VA_ARGS__) << "Check failed: [" << #condition << "] "
4523#define CPCHECK(condition, ...) CPLOG_IF(!(condition), FATAL, __VA_ARGS__) << "Check failed: [" << #condition << "] "
4524#define CHECK(condition) CCHECK(condition, ELPP_CURR_FILE_LOGGER_ID)
4525#define PCHECK(condition) CPCHECK(condition, ELPP_CURR_FILE_LOGGER_ID)
4526#define CCHECK_EQ(a, b, ...) CCHECK(a == b, __VA_ARGS__)
4527#define CCHECK_NE(a, b, ...) CCHECK(a != b, __VA_ARGS__)
4528#define CCHECK_LT(a, b, ...) CCHECK(a < b, __VA_ARGS__)
4529#define CCHECK_GT(a, b, ...) CCHECK(a > b, __VA_ARGS__)
4530#define CCHECK_LE(a, b, ...) CCHECK(a <= b, __VA_ARGS__)
4531#define CCHECK_GE(a, b, ...) CCHECK(a >= b, __VA_ARGS__)
4532#define CCHECK_BOUNDS(val, min, max, ...) CCHECK(val >= min && val <= max, __VA_ARGS__)
4533#define CHECK_EQ(a, b) CCHECK_EQ(a, b, ELPP_CURR_FILE_LOGGER_ID)
4534#define CHECK_NE(a, b) CCHECK_NE(a, b, ELPP_CURR_FILE_LOGGER_ID)
4535#define CHECK_LT(a, b) CCHECK_LT(a, b, ELPP_CURR_FILE_LOGGER_ID)
4536#define CHECK_GT(a, b) CCHECK_GT(a, b, ELPP_CURR_FILE_LOGGER_ID)
4537#define CHECK_LE(a, b) CCHECK_LE(a, b, ELPP_CURR_FILE_LOGGER_ID)
4538#define CHECK_GE(a, b) CCHECK_GE(a, b, ELPP_CURR_FILE_LOGGER_ID)
4539#define CHECK_BOUNDS(val, min, max) CCHECK_BOUNDS(val, min, max, ELPP_CURR_FILE_LOGGER_ID)
4540#define CCHECK_NOTNULL(ptr, ...) CCHECK((ptr) != nullptr, __VA_ARGS__)
4541#define CCHECK_STREQ(str1, str2, ...) CLOG_IF(!el::base::utils::Str::cStringEq(str1, str2), FATAL, __VA_ARGS__) \
4542<< "Check failed: [" << #str1 << " == " << #str2 << "] "
4543#define CCHECK_STRNE(str1, str2, ...) CLOG_IF(el::base::utils::Str::cStringEq(str1, str2), FATAL, __VA_ARGS__) \
4544<< "Check failed: [" << #str1 << " != " << #str2 << "] "
4545#define CCHECK_STRCASEEQ(str1, str2, ...) CLOG_IF(!el::base::utils::Str::cStringCaseEq(str1, str2), FATAL, __VA_ARGS__) \
4546<< "Check failed: [" << #str1 << " == " << #str2 << "] "
4547#define CCHECK_STRCASENE(str1, str2, ...) CLOG_IF(el::base::utils::Str::cStringCaseEq(str1, str2), FATAL, __VA_ARGS__) \
4548<< "Check failed: [" << #str1 << " != " << #str2 << "] "
4549#define CHECK_NOTNULL(ptr) CCHECK_NOTNULL((ptr), ELPP_CURR_FILE_LOGGER_ID)
4550#define CHECK_STREQ(str1, str2) CCHECK_STREQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4551#define CHECK_STRNE(str1, str2) CCHECK_STRNE(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4552#define CHECK_STRCASEEQ(str1, str2) CCHECK_STRCASEEQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4553#define CHECK_STRCASENE(str1, str2) CCHECK_STRCASENE(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4561#undef DCCHECK_BOUNDS
4562#undef DCCHECK_NOTNULL
4563#undef DCCHECK_STRCASEEQ
4564#undef DCCHECK_STRCASENE
4573#undef DCHECK_BOUNDS_
4574#undef DCHECK_NOTNULL
4575#undef DCHECK_STRCASEEQ
4576#undef DCHECK_STRCASENE
4578#define DCCHECK(condition, ...) if (ELPP_DEBUG_LOG) CCHECK(condition, __VA_ARGS__)
4579#define DCCHECK_EQ(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_EQ(a, b, __VA_ARGS__)
4580#define DCCHECK_NE(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_NE(a, b, __VA_ARGS__)
4581#define DCCHECK_LT(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_LT(a, b, __VA_ARGS__)
4582#define DCCHECK_GT(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_GT(a, b, __VA_ARGS__)
4583#define DCCHECK_LE(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_LE(a, b, __VA_ARGS__)
4584#define DCCHECK_GE(a, b, ...) if (ELPP_DEBUG_LOG) CCHECK_GE(a, b, __VA_ARGS__)
4585#define DCCHECK_BOUNDS(val, min, max, ...) if (ELPP_DEBUG_LOG) CCHECK_BOUNDS(val, min, max, __VA_ARGS__)
4586#define DCCHECK_NOTNULL(ptr, ...) if (ELPP_DEBUG_LOG) CCHECK_NOTNULL((ptr), __VA_ARGS__)
4587#define DCCHECK_STREQ(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STREQ(str1, str2, __VA_ARGS__)
4588#define DCCHECK_STRNE(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STRNE(str1, str2, __VA_ARGS__)
4589#define DCCHECK_STRCASEEQ(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STRCASEEQ(str1, str2, __VA_ARGS__)
4590#define DCCHECK_STRCASENE(str1, str2, ...) if (ELPP_DEBUG_LOG) CCHECK_STRCASENE(str1, str2, __VA_ARGS__)
4591#define DCPCHECK(condition, ...) if (ELPP_DEBUG_LOG) CPCHECK(condition, __VA_ARGS__)
4592#define DCHECK(condition) DCCHECK(condition, ELPP_CURR_FILE_LOGGER_ID)
4593#define DCHECK_EQ(a, b) DCCHECK_EQ(a, b, ELPP_CURR_FILE_LOGGER_ID)
4594#define DCHECK_NE(a, b) DCCHECK_NE(a, b, ELPP_CURR_FILE_LOGGER_ID)
4595#define DCHECK_LT(a, b) DCCHECK_LT(a, b, ELPP_CURR_FILE_LOGGER_ID)
4596#define DCHECK_GT(a, b) DCCHECK_GT(a, b, ELPP_CURR_FILE_LOGGER_ID)
4597#define DCHECK_LE(a, b) DCCHECK_LE(a, b, ELPP_CURR_FILE_LOGGER_ID)
4598#define DCHECK_GE(a, b) DCCHECK_GE(a, b, ELPP_CURR_FILE_LOGGER_ID)
4599#define DCHECK_BOUNDS(val, min, max) DCCHECK_BOUNDS(val, min, max, ELPP_CURR_FILE_LOGGER_ID)
4600#define DCHECK_NOTNULL(ptr) DCCHECK_NOTNULL((ptr), ELPP_CURR_FILE_LOGGER_ID)
4601#define DCHECK_STREQ(str1, str2) DCCHECK_STREQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4602#define DCHECK_STRNE(str1, str2) DCCHECK_STRNE(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4603#define DCHECK_STRCASEEQ(str1, str2) DCCHECK_STRCASEEQ(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4604#define DCHECK_STRCASENE(str1, str2) DCCHECK_STRCASENE(str1, str2, ELPP_CURR_FILE_LOGGER_ID)
4605#define DPCHECK(condition) DCPCHECK(condition, ELPP_CURR_FILE_LOGGER_ID)
4607#if defined(ELPP_DISABLE_DEFAULT_CRASH_HANDLING)
4608# define ELPP_USE_DEF_CRASH_HANDLER false
4610# define ELPP_USE_DEF_CRASH_HANDLER true
4612#define ELPP_CRASH_HANDLER_INIT
4613#define ELPP_INIT_EASYLOGGINGPP(val) \
4616el::base::type::StoragePointer elStorage(val); \
4618el::base::debug::CrashHandler elCrashHandler(ELPP_USE_DEF_CRASH_HANDLER); \
4621#if ELPP_ASYNC_LOGGING
4622# define INITIALIZE_EASYLOGGINGPP ELPP_INIT_EASYLOGGINGPP(new el::base::Storage(el::LogBuilderPtr(new el::base::DefaultLogBuilder()),\
4623new el::base::AsyncDispatchWorker()))
4625# define INITIALIZE_EASYLOGGINGPP ELPP_INIT_EASYLOGGINGPP(new el::base::Storage(el::LogBuilderPtr(new el::base::DefaultLogBuilder())))
4627#define INITIALIZE_NULL_EASYLOGGINGPP \
4630el::base::type::StoragePointer elStorage;\
4632el::base::debug::CrashHandler elCrashHandler(ELPP_USE_DEF_CRASH_HANDLER);\
4634#define SHARE_EASYLOGGINGPP(initializedStorage)\
4637el::base::type::StoragePointer elStorage(initializedStorage);\
4639el::base::debug::CrashHandler elCrashHandler(ELPP_USE_DEF_CRASH_HANDLER);\
4642#if defined(ELPP_UNICODE)
4643# define START_EASYLOGGINGPP(argc, argv) el::Helpers::setArgs(argc, argv); std::locale::global(std::locale(""))
4645# 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:263
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:304
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:295
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:350
Predicate(Level level, ConfigurationType configurationType)
Used to find configuration from configuration (pointers) repository. Avoid using it.
Definition easylogging++.cc:345
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:322
Level level(void) const
Gets level of current configuration.
Definition easylogging++.h:1725
Configuration(const Configuration &c)
Definition easylogging++.cc:316
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:549
static bool parseLine(std::string *line, std::string *currConfigStr, std::string *currLevelStr, Level *currLevel, Configurations *conf)
Definition easylogging++.cc:557
static bool parseFromFile(const std::string &configurationFile, Configurations *sender, Configurations *base=nullptr)
Parses configuration from file.
Definition easylogging++.cc:488
static void ignoreComments(std::string *line)
Definition easylogging++.cc:522
static bool isLevel(const std::string &line)
Definition easylogging++.cc:541
static bool parseFromText(const std::string &configurationsString, Configurations *sender, Configurations *base=nullptr)
Parse configurations from configuration string.
Definition easylogging++.cc:506
static bool isComment(const std::string &line)
Definition easylogging++.cc:545
Thread-safe Configuration repository.
Definition easylogging++.h:1769
void unsafeSet(Level level, ConfigurationType configurationType, const std::string &value)
Thread unsafe set.
Definition easylogging++.cc:624
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:648
void unsafeSetIfNotExist(Level level, ConfigurationType configurationType, const std::string &value)
Unsafely sets configuration if does not already exist.
Definition easylogging++.cc:617
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:356
virtual ~Configurations(void)
Definition easylogging++.h:1783
Static helpers for developers.
Definition easylogging++.h:3716
static base::type::StoragePointer storage()
Definition easylogging++.h:3723
static bool hasCustomFormatSpecifier(const char *formatSpecifier)
Returns true if custom format specifier is installed.
Definition easylogging++.h:3837
static bool uninstallCustomFormatSpecifier(const char *formatSpecifier)
Uninstalls user defined format specifier and handler.
Definition easylogging++.h:3833
static void setThreadName(const std::string &name)
Sets thread name for current thread. Requires std::thread.
Definition easylogging++.h:3735
static bool installLogDispatchCallback(const std::string &id)
Installs post log dispatch callback, this callback is triggered when log is dispatched.
Definition easylogging++.h:3770
static void setArgs(int argc, char **argv)
Sets application arguments and figures out whats active for logging and whats not.
Definition easylogging++.h:3727
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:3800
static T * logDispatchCallback(const std::string &id)
Definition easylogging++.h:3779
static void installCustomFormatSpecifier(const CustomFormatSpecifier &customFormatSpecifier)
Installs user defined format specifier and handler.
Definition easylogging++.h:3829
static const el::base::utils::CommandLineArgs * commandLineArgs(void)
Returns command line arguments (pointer) provided to easylogging++.
Definition easylogging++.h:3820
static void uninstallPreRollOutCallback(void)
Uninstalls pre rollout callback.
Definition easylogging++.h:3765
static void uninstallLogDispatchCallback(const std::string &id)
Uninstalls log dispatch callback.
Definition easylogging++.h:3775
static std::string getThreadName()
Definition easylogging++.h:3738
static void validateFileRolling(Logger *logger, Level level)
Definition easylogging++.h:3840
static void setStorage(base::type::StoragePointer storage)
Shares logging repository (base::Storage).
Definition easylogging++.h:3719
static void setArgs(int argc, const char **argv)
Sets application arguments and figures out whats active for logging and whats not.
Definition easylogging++.h:3731
static void reserveCustomFormatSpecifiers(std::size_t size)
Reserve space for custom format specifiers for performance.
Definition easylogging++.h:3825
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:222
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:231
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:251
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:193
Definition easylogging++.h:2237
LogBuilder()
Definition easylogging++.h:2239
void convertToColoredOutput(base::type::string_t *logLine, Level level, Color color)
Definition easylogging++.cc:662
virtual base::type::string_t build(const LogMessage *logMessage, bool appendNewLine) const =0
void setColor(Color color, bool bright)
Definition easylogging++.cc:692
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:2435
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:2424
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:731
LogBuilder * logBuilder(void) const
Definition easylogging++.h:2306
Logger(const std::string &id, base::LogStreamsReferenceMap *logStreamsReference)
Definition easylogging++.cc:701
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:802
const std::string & parentApplicationName(void) const
Definition easylogging++.h:2279
std::string m_parentApplicationName
Definition easylogging++.h:2343
ScopedAddFlag(LoggingFlag flag)
Definition easylogging++.h:3925
LoggingFlag m_flag
Definition easylogging++.h:3932
~ScopedAddFlag(void)
Definition easylogging++.h:3928
LoggingFlag m_flag
Definition easylogging++.h:3944
~ScopedRemoveFlag(void)
Definition easylogging++.h:3940
ScopedRemoveFlag(LoggingFlag flag)
Definition easylogging++.h:3937
Static helpers to deal with loggers and their configurations.
Definition easylogging++.h:3846
static bool allowed(Level leve, const char *cat)
Determines whether logging will occur at this level and category.
Definition easylogging++.cc:3369
static void reconfigureAllLoggers(ConfigurationType configurationType, const std::string &value)
Reconfigures single configuration for all the loggers.
Definition easylogging++.h:3883
static void removeFlag(LoggingFlag flag)
Removes logging flag used internally.
Definition easylogging++.h:3915
static void reconfigureAllLoggers(const Configurations &configurations)
Reconfigures all the existing loggers with new configurations.
Definition easylogging++.cc:3414
static Logger * getLogger(const std::string &identity, bool registerIfNotAvailable=true)
Gets existing or registers new logger.
Definition easylogging++.cc:3377
static bool hasFlag(LoggingFlag flag)
Determines whether or not certain flag is active.
Definition easylogging++.h:3919
static void uninstallLoggerRegistrationCallback(const std::string &id)
Uninstalls log dispatch callback.
Definition easylogging++.h:3861
static bool installLoggerRegistrationCallback(const std::string &id)
Installs logger registration callback, this callback is triggered when new logger is registered.
Definition easylogging++.h:3856
static void setDefaultLogBuilder(el::LogBuilderPtr &logBuilderPtr)
Changes default log builder for future loggers.
Definition easylogging++.cc:3381
static void addFlag(LoggingFlag flag)
Adds logging flag used internally.
Definition easylogging++.h:3911
static void setLoggingLevel(Level level)
Sets hierarchy for logging. Needs to enable logging flag (HierarchicalLogging).
Definition easylogging++.h:3947
static T * loggerRegistrationCallback(const std::string &id)
Definition easylogging++.h:3865
SysLogInitializer(const char *processIdent, int options=0, int facility=0)
Definition easylogging++.h:3699
virtual ~SysLogInitializer(void)
Definition easylogging++.h:3708
Definition easylogging++.h:3969
static const std::string releaseDate(void)
Release date of current version.
Definition easylogging++.cc:3562
Definition easylogging++.h:2834
base::type::string_t build(const LogMessage *logMessage, bool appendNewLine) const
Definition easylogging++.cc:2787
Definition easylogging++.h:2795
void handle(const LogDispatchData *data)
Definition easylogging++.cc:2456
void dispatch(base::type::string_t &&rawLinePrefix, base::type::string_t &&rawLinePayload, base::type::string_t &&logLine)
Definition easylogging++.cc:2601
const LogDispatchData * m_data
Definition easylogging++.h:2799
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:2839
LogDispatcher(bool proceed, LogMessage *logMessage, base::DispatchAction dispatchAction)
Definition easylogging++.h:2841
LogMessage * m_logMessage
Definition easylogging++.h:2851
bool m_proceed
Definition easylogging++.h:2850
base::DispatchAction m_dispatchAction
Definition easylogging++.h:2852
Definition easylogging++.h:2931
Logger * m_logger
Definition easylogging++.h:3219
MessageBuilder & operator<<(const std::string &msg)
Definition easylogging++.h:2945
MessageBuilder & writeIterator(Iterator begin_, Iterator end_, std::size_t size_)
Definition easylogging++.h:3223
MessageBuilder & operator<<(std::ostream &(*OStreamMani)(std::ostream &))
Definition easylogging++.h:2967
MessageBuilder(void)
Definition easylogging++.h:2933
const base::type::char_t * m_containerLogSeperator
Definition easylogging++.h:3220
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:3245
NullWriter(void)
Definition easylogging++.h:3242
NullWriter & operator<<(const T &)
Definition easylogging++.h:3250
Definition easylogging++.h:3314
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:3316
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:1953
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:1983
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:1966
Loggers repository.
Definition easylogging++.h:2388
std::unordered_map< std::string, base::type::LoggerRegistrationCallbackPtr > m_loggerRegistrationCallbacks
Definition easylogging++.h:2452
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:2040
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:1998
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:2300
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:2393
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
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:1727
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:1932
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:2051
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:2055
Main entry point of each logging.
Definition easylogging++.h:3259
void initializeLogger(const std::string &loggerId, bool lookup=true, bool needLock=true)
Definition easylogging++.cc:2958
Logger * m_logger
Definition easylogging++.h:3301
const char * m_file
Definition easylogging++.h:3297
bool m_proceed
Definition easylogging++.h:3302
Level m_level
Definition easylogging++.h:3295
base::type::VerboseLevel m_verboseLevel
Definition easylogging++.h:3300
const char * m_func
Definition easylogging++.h:3299
Writer(LogMessage *msg, base::DispatchAction dispatchAction=base::DispatchAction::NormalLog)
Definition easylogging++.h:3268
base::MessageBuilder m_messageBuilder
Definition easylogging++.h:3303
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:3261
virtual ~Writer(void)
Definition easylogging++.h:3273
std::vector< std::string > m_loggerIds
Definition easylogging++.h:3305
LogMessage * m_msg
Definition easylogging++.h:3294
const base::type::LineNumber m_line
Definition easylogging++.h:3298
Writer & operator<<(const std::string &log)
Definition easylogging++.h:3277
base::threading::ScopedLock m_sync
Definition easylogging++.h:3306
base::DispatchAction m_dispatchAction
Definition easylogging++.h:3304
Color m_color
Definition easylogging++.h:3296
void processDispatch()
Definition easylogging++.cc:2999
void triggerDispatch(void)
Definition easylogging++.cc:3052
CrashHandler(bool)
Definition easylogging++.h:3688
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:1297
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:1326
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:1264
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:1308
static std::string getDateTime(const char *format, const base::SubsecondPrecision *ssPrec)
Gets current date and time with a subsecond part.
Definition easylogging++.cc:1291
static struct::tm * buildTimeInfo(struct timeval *currTime, struct ::tm *timeInfo)
Definition easylogging++.cc:1339
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:1365
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:829
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:931
static bool pathExists(const char *path, bool considerFile=false)
Determines whether or not provided path exist in current file system.
Definition easylogging++.cc:863
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:947
static bool createPath(const std::string &path)
Creates specified path on file system.
Definition easylogging++.cc:880
static std::size_t getSizeOfFile(base::type::fstream_t *fs)
Gets size of file provided in stream.
Definition easylogging++.cc:853
static std::string extractPathFromFilename(const std::string &fullPath, const char *seperator=base::consts::kFilePathSeperator)
Extracts path of filename with leading slash.
Definition easylogging++.cc:920
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:1234
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:1197
static const std::string getBashOutput(const char *command)
Runs command on terminal and returns the output.
Definition easylogging++.cc:1169
static std::string currentUser(void)
Gets current username.
Definition easylogging++.cc:1221
static bool termSupportsColor(std::string &term)
Whether or not the named terminal supports colors.
Definition easylogging++.cc:1252
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)
Gets pointer from repository. If none found, nullptr is returned.
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
static constexpr const char hex[]
Definition wipeable_string.cpp:36
static std::vector< std::string > lookup(lookup_t type, const char *hostname)
Definition dns_checks.cpp:47
#define ELPP_ITERATOR_CONTAINER_LOG_TWO_ARG(temp)
Definition easylogging++.h:2976
#define ELPP_FINAL
Definition easylogging++.h:284
#define ELPP_ITERATOR_CONTAINER_LOG_FOUR_ARG(temp)
Definition easylogging++.h:2986
#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:2971
#define ELPP_LITERAL(txt)
Definition easylogging++.h:539
#define ELPP_SIMPLE_LOG(LOG_TYPE)
Definition easylogging++.h:2936
#define ELPP_ITERATOR_CONTAINER_LOG_THREE_ARG(temp)
Definition easylogging++.h:2981
#define ELPP_ITERATOR_CONTAINER_LOG_FIVE_ARG(temp)
Definition easylogging++.h:2991
#define ELPP
Definition easylogging++.h:2794
#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
#define const
Definition ipfrdr.c:80
static void log()
Definition logging.cpp:85
static void init()
Definition logging.cpp:42
static MDB_envinfo info
Definition mdb_load.c:37
static int version
Definition mdb_load.c:29
args
Definition build_protob.py:10
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
const base::type::char_t * unit
Definition easylogging++.h:798
const char * name
Definition easylogging++.h:810
static const char kFormatSpecifierChar
Definition easylogging++.h:764
const struct el::base::consts::@316026342360375017143256044144076315127247255074 kCrashSignals[]
const char * brief
Definition easylogging++.h:811
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
double value
Definition easylogging++.h:797
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
int numb
Definition easylogging++.h:809
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:118
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:30
static int priority(Level level)
Definition easylogging++.cc:2136
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
@ VerboseLevel
Definition easylogging++.h:857
@ 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:27
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
@ MillisecondsWidth
Alias of SubsecondPrecision (for backward compatibility).
Definition easylogging++.h:680
@ 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
c
Definition pymoduletest.py:79
int
Definition pymoduletest.py:17
@ empty
Definition readline_buffer.h:9
internal::ArgsMatcher< InnerMatcher > Args(const InnerMatcher &matcher)
Definition gmock-generated-matchers.h:481
const char * name
Definition options.c:30
enum upnpconfigoptions id
Definition options.c:29
const GenericPointer< typename T::ValueType > T2 value
Definition pointer.h:1225
const GenericPointer< typename T::ValueType > & pointer
Definition pointer.h:1124
const char *const str
Definition portlistingparse.c:23
#define M(w0, w14, w9, w1)
Definition sha512-blocks.c:41
tools::wallet2::message_signature_result_t result
Definition signature.cpp:62
const char * buf
Definition slow_memmem.cpp:73
std::size_t operator()(const el::Level &l) const
Definition easylogging++.h:624
std::string data
Definition base58.cpp:37