@ -604,6 +604,15 @@ enum class Level : base::type::EnumType {
/// @brief Represents unknown level
/// @brief Represents unknown level
Unknown = 1010
Unknown = 1010
} ;
} ;
enum class Color : base : : type : : EnumType {
Default ,
Red ,
Green ,
Yellow ,
Blue ,
Magenta ,
Cyan ,
} ;
} // namespace el
} // namespace el
namespace std {
namespace std {
template < > struct hash < el : : Level > {
template < > struct hash < el : : Level > {
@ -2225,7 +2234,7 @@ class LogBuilder : base::NoCopy {
ELPP_INTERNAL_INFO ( 3 , " Destroying log builder... " )
ELPP_INTERNAL_INFO ( 3 , " Destroying log builder... " )
}
}
virtual base : : type : : string_t build ( const LogMessage * logMessage , bool appendNewLine ) const = 0 ;
virtual base : : type : : string_t build ( const LogMessage * logMessage , bool appendNewLine ) const = 0 ;
void convertToColoredOutput ( base : : type : : string_t * logLine , Level level );
void convertToColoredOutput ( base : : type : : string_t * logLine , Level level , Color color );
private :
private :
bool m_termSupportsColor ;
bool m_termSupportsColor ;
friend class el : : base : : DefaultLogDispatchCallback ;
friend class el : : base : : DefaultLogDispatchCallback ;
@ -2503,14 +2512,17 @@ class VRegistry : base::NoCopy, public base::threading::ThreadSafe {
} // namespace base
} // namespace base
class LogMessage {
class LogMessage {
public :
public :
LogMessage ( Level level , const std : : string & file , base : : type : : LineNumber line , const std : : string & func ,
LogMessage ( Level level , Color color , const std : : string & file , base : : type : : LineNumber line , const std : : string & func ,
base : : type : : VerboseLevel verboseLevel , Logger * logger ) :
base : : type : : VerboseLevel verboseLevel , Logger * logger , const base : : type : : string_t * msg = nullptr ) :
m_level ( level ) , m_ file( file ) , m_line ( line ) , m_func ( func ) ,
m_level ( level ) , m_ color( color ) , m_ file( file ) , m_line ( line ) , m_func ( func ) ,
m_verboseLevel ( verboseLevel ) , m_logger ( logger ) , m_message ( logger- > stream ( ) . str ( ) ) {
m_verboseLevel ( verboseLevel ) , m_logger ( logger ) , m_message ( msg ? * msg : logger- > stream ( ) . str ( ) ) {
}
}
inline Level level ( void ) const {
inline Level level ( void ) const {
return m_level ;
return m_level ;
}
}
inline Color color ( void ) const {
return m_color ;
}
inline const std : : string & file ( void ) const {
inline const std : : string & file ( void ) const {
return m_file ;
return m_file ;
}
}
@ -2531,6 +2543,7 @@ class LogMessage {
}
}
private :
private :
Level m_level ;
Level m_level ;
Color m_color ;
std : : string m_file ;
std : : string m_file ;
base : : type : : LineNumber m_line ;
base : : type : : LineNumber m_line ;
std : : string m_func ;
std : : string m_func ;
@ -2781,7 +2794,7 @@ class DefaultLogDispatchCallback : public LogDispatchCallback {
void handle ( const LogDispatchData * data ) ;
void handle ( const LogDispatchData * data ) ;
private :
private :
const LogDispatchData * m_data ;
const LogDispatchData * m_data ;
void dispatch ( base : : type : : string_t & & rawLine , base : : type : : string_t & & logLine ) ;
void dispatch ( base : : type : : string_t & & rawLine Prefix, base : : type : : string_t & & rawLinePayload , base : : type : : string_t & & logLine ) ;
} ;
} ;
# if ELPP_ASYNC_LOGGING
# if ELPP_ASYNC_LOGGING
class AsyncLogDispatchCallback : public LogDispatchCallback {
class AsyncLogDispatchCallback : public LogDispatchCallback {
@ -3242,10 +3255,10 @@ class NullWriter : base::NoCopy {
/// @brief Main entry point of each logging
/// @brief Main entry point of each logging
class Writer : base : : NoCopy {
class Writer : base : : NoCopy {
public :
public :
Writer ( Level level , const char * file , base : : type : : LineNumber line ,
Writer ( Level level , Color color , const char * file , base : : type : : LineNumber line ,
const char * func , base : : DispatchAction dispatchAction = base : : DispatchAction : : NormalLog ,
const char * func , base : : DispatchAction dispatchAction = base : : DispatchAction : : NormalLog ,
base : : type : : VerboseLevel verboseLevel = 0 ) :
base : : type : : VerboseLevel verboseLevel = 0 ) :
m_msg ( nullptr ) , m_level ( level ) , m_ file( file ) , m_line ( line ) , m_func ( func ) , m_verboseLevel ( verboseLevel ) ,
m_msg ( nullptr ) , m_level ( level ) , m_ color( color ) , m_ file( file ) , m_line ( line ) , m_func ( func ) , m_verboseLevel ( verboseLevel ) ,
m_logger ( nullptr ) , m_proceed ( false ) , m_dispatchAction ( dispatchAction ) {
m_logger ( nullptr ) , m_proceed ( false ) , m_dispatchAction ( dispatchAction ) {
}
}
@ -3299,6 +3312,7 @@ class Writer : base::NoCopy {
protected :
protected :
LogMessage * m_msg ;
LogMessage * m_msg ;
Level m_level ;
Level m_level ;
Color m_color ;
const char * m_file ;
const char * m_file ;
const base : : type : : LineNumber m_line ;
const base : : type : : LineNumber m_line ;
const char * m_func ;
const char * m_func ;
@ -3317,10 +3331,10 @@ class Writer : base::NoCopy {
} ;
} ;
class PErrorWriter : public base : : Writer {
class PErrorWriter : public base : : Writer {
public :
public :
PErrorWriter ( Level level , const char * file , base : : type : : LineNumber line ,
PErrorWriter ( Level level , Color color , const char * file , base : : type : : LineNumber line ,
const char * func , base : : DispatchAction dispatchAction = base : : DispatchAction : : NormalLog ,
const char * func , base : : DispatchAction dispatchAction = base : : DispatchAction : : NormalLog ,
base : : type : : VerboseLevel verboseLevel = 0 ) :
base : : type : : VerboseLevel verboseLevel = 0 ) :
base : : Writer ( level , file, line , func , dispatchAction , verboseLevel ) {
base : : Writer ( level , color, file, line , func , dispatchAction , verboseLevel ) {
}
}
virtual ~ PErrorWriter ( void ) ;
virtual ~ PErrorWriter ( void ) ;
@ -3353,14 +3367,14 @@ template <typename T>
void Logger : : log_ ( Level level , int vlevel , const T & log ) {
void Logger : : log_ ( Level level , int vlevel , const T & log ) {
if ( level = = Level : : Verbose ) {
if ( level = = Level : : Verbose ) {
if ( ELPP - > vRegistry ( ) - > allowed ( vlevel , __FILE__ ) ) {
if ( ELPP - > vRegistry ( ) - > allowed ( vlevel , __FILE__ ) ) {
base : : Writer ( Level : : Verbose , " FILE " , 0 , " FUNCTION " ,
base : : Writer ( Level : : Verbose , Color : : Default , " FILE " , 0 , " FUNCTION " ,
base : : DispatchAction : : NormalLog , vlevel ) . construct ( this , false ) < < log ;
base : : DispatchAction : : NormalLog , vlevel ) . construct ( this , false ) < < log ;
} else {
} else {
stream ( ) . str ( ELPP_LITERAL ( " " ) ) ;
stream ( ) . str ( ELPP_LITERAL ( " " ) ) ;
releaseLock ( ) ;
releaseLock ( ) ;
}
}
} else {
} else {
base : : Writer ( level , " FILE " , 0 , " FUNCTION " ) . construct ( this , false ) < < log ;
base : : Writer ( level , Color : : Default , " FILE " , 0 , " FUNCTION " ) . construct ( this , false ) < < log ;
}
}
}
}
template < typename T , typename . . . Args >
template < typename T , typename . . . Args >
@ -3460,18 +3474,18 @@ LOGGER_LEVEL_WRITERS_DISABLED(trace, Level::Trace)
# endif // ELPP_COMPILER_MSVC
# endif // ELPP_COMPILER_MSVC
# define el_resolveVALength(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
# define el_resolveVALength(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
# define ELPP_WRITE_LOG(writer, level, dispatchAction, ...) \
# define ELPP_WRITE_LOG(writer, level, dispatchAction, ...) \
writer ( level , __FILE__, __LINE__ , ELPP_FUNC , dispatchAction ) . construct ( el_getVALength ( __VA_ARGS__ ) , __VA_ARGS__ )
writer ( level , el: : Color : : Default , __FILE__, __LINE__ , ELPP_FUNC , dispatchAction ) . construct ( el_getVALength ( __VA_ARGS__ ) , __VA_ARGS__ )
# define ELPP_WRITE_LOG_IF(writer, condition, level, dispatchAction, ...) if (condition) \
# define ELPP_WRITE_LOG_IF(writer, condition, level, dispatchAction, ...) if (condition) \
writer ( level , __FILE__, __LINE__ , ELPP_FUNC , dispatchAction ) . construct ( el_getVALength ( __VA_ARGS__ ) , __VA_ARGS__ )
writer ( level , el: : Color : : Default , __FILE__, __LINE__ , ELPP_FUNC , dispatchAction ) . construct ( el_getVALength ( __VA_ARGS__ ) , __VA_ARGS__ )
# define ELPP_WRITE_LOG_EVERY_N(writer, occasion, level, dispatchAction, ...) \
# define ELPP_WRITE_LOG_EVERY_N(writer, occasion, level, dispatchAction, ...) \
ELPP - > validateEveryNCounter ( __FILE__ , __LINE__ , occasion ) & & \
ELPP - > validateEveryNCounter ( __FILE__ , __LINE__ , occasion ) & & \
writer ( level , __FILE__, __LINE__ , ELPP_FUNC , dispatchAction ) . construct ( el_getVALength ( __VA_ARGS__ ) , __VA_ARGS__ )
writer ( level , el: : Color : : Default , __FILE__, __LINE__ , ELPP_FUNC , dispatchAction ) . construct ( el_getVALength ( __VA_ARGS__ ) , __VA_ARGS__ )
# define ELPP_WRITE_LOG_AFTER_N(writer, n, level, dispatchAction, ...) \
# define ELPP_WRITE_LOG_AFTER_N(writer, n, level, dispatchAction, ...) \
ELPP - > validateAfterNCounter ( __FILE__ , __LINE__ , n ) & & \
ELPP - > validateAfterNCounter ( __FILE__ , __LINE__ , n ) & & \
writer ( level , __FILE__, __LINE__ , ELPP_FUNC , dispatchAction ) . construct ( el_getVALength ( __VA_ARGS__ ) , __VA_ARGS__ )
writer ( level , el: : Color : : Default , __FILE__, __LINE__ , ELPP_FUNC , dispatchAction ) . construct ( el_getVALength ( __VA_ARGS__ ) , __VA_ARGS__ )
# define ELPP_WRITE_LOG_N_TIMES(writer, n, level, dispatchAction, ...) \
# define ELPP_WRITE_LOG_N_TIMES(writer, n, level, dispatchAction, ...) \
ELPP - > validateNTimesCounter ( __FILE__ , __LINE__ , n ) & & \
ELPP - > validateNTimesCounter ( __FILE__ , __LINE__ , n ) & & \
writer ( level , __FILE__, __LINE__ , ELPP_FUNC , dispatchAction ) . construct ( el_getVALength ( __VA_ARGS__ ) , __VA_ARGS__ )
writer ( level , el: : Color : : Default , __FILE__, __LINE__ , ELPP_FUNC , dispatchAction ) . construct ( el_getVALength ( __VA_ARGS__ ) , __VA_ARGS__ )
# if defined(ELPP_FEATURE_ALL) || defined(ELPP_FEATURE_PERFORMANCE_TRACKING)
# if defined(ELPP_FEATURE_ALL) || defined(ELPP_FEATURE_PERFORMANCE_TRACKING)
class PerformanceTrackingData {
class PerformanceTrackingData {
public :
public :