Properly format multiline logs
As a side effect, colouring on Windows should now work regardless of version
This commit is contained in:
+31
-17
@@ -604,6 +604,15 @@ enum class Level : base::type::EnumType {
|
||||
/// @brief Represents unknown level
|
||||
Unknown = 1010
|
||||
};
|
||||
enum class Color : base::type::EnumType {
|
||||
Default,
|
||||
Red,
|
||||
Green,
|
||||
Yellow,
|
||||
Blue,
|
||||
Magenta,
|
||||
Cyan,
|
||||
};
|
||||
} // namespace el
|
||||
namespace std {
|
||||
template<> struct hash<el::Level> {
|
||||
@@ -2225,7 +2234,7 @@ class LogBuilder : base::NoCopy {
|
||||
ELPP_INTERNAL_INFO(3, "Destroying log builder...")
|
||||
}
|
||||
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:
|
||||
bool m_termSupportsColor;
|
||||
friend class el::base::DefaultLogDispatchCallback;
|
||||
@@ -2503,14 +2512,17 @@ class VRegistry : base::NoCopy, public base::threading::ThreadSafe {
|
||||
} // namespace base
|
||||
class LogMessage {
|
||||
public:
|
||||
LogMessage(Level level, const std::string& file, base::type::LineNumber line, const std::string& func,
|
||||
base::type::VerboseLevel verboseLevel, Logger* logger) :
|
||||
m_level(level), m_file(file), m_line(line), m_func(func),
|
||||
m_verboseLevel(verboseLevel), m_logger(logger), m_message(logger->stream().str()) {
|
||||
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) :
|
||||
m_level(level), m_color(color), m_file(file), m_line(line), m_func(func),
|
||||
m_verboseLevel(verboseLevel), m_logger(logger), m_message(msg ? *msg : logger->stream().str()) {
|
||||
}
|
||||
inline Level level(void) const {
|
||||
return m_level;
|
||||
}
|
||||
inline Color color(void) const {
|
||||
return m_color;
|
||||
}
|
||||
inline const std::string& file(void) const {
|
||||
return m_file;
|
||||
}
|
||||
@@ -2531,6 +2543,7 @@ class LogMessage {
|
||||
}
|
||||
private:
|
||||
Level m_level;
|
||||
Color m_color;
|
||||
std::string m_file;
|
||||
base::type::LineNumber m_line;
|
||||
std::string m_func;
|
||||
@@ -2781,7 +2794,7 @@ class DefaultLogDispatchCallback : public LogDispatchCallback {
|
||||
void handle(const LogDispatchData* data);
|
||||
private:
|
||||
const LogDispatchData* m_data;
|
||||
void dispatch(base::type::string_t&& rawLine, base::type::string_t&& logLine);
|
||||
void dispatch(base::type::string_t&& rawLinePrefix, base::type::string_t&& rawLinePayload, base::type::string_t&& logLine);
|
||||
};
|
||||
#if ELPP_ASYNC_LOGGING
|
||||
class AsyncLogDispatchCallback : public LogDispatchCallback {
|
||||
@@ -3242,10 +3255,10 @@ class NullWriter : base::NoCopy {
|
||||
/// @brief Main entry point of each logging
|
||||
class Writer : base::NoCopy {
|
||||
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,
|
||||
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) {
|
||||
}
|
||||
|
||||
@@ -3299,6 +3312,7 @@ class Writer : base::NoCopy {
|
||||
protected:
|
||||
LogMessage* m_msg;
|
||||
Level m_level;
|
||||
Color m_color;
|
||||
const char* m_file;
|
||||
const base::type::LineNumber m_line;
|
||||
const char* m_func;
|
||||
@@ -3317,10 +3331,10 @@ class Writer : base::NoCopy {
|
||||
};
|
||||
class PErrorWriter : public base::Writer {
|
||||
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,
|
||||
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);
|
||||
@@ -3353,14 +3367,14 @@ template <typename T>
|
||||
void Logger::log_(Level level, int vlevel, const T& log) {
|
||||
if (level == Level::Verbose) {
|
||||
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;
|
||||
} else {
|
||||
stream().str(ELPP_LITERAL(""));
|
||||
releaseLock();
|
||||
}
|
||||
} 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>
|
||||
@@ -3460,18 +3474,18 @@ LOGGER_LEVEL_WRITERS_DISABLED(trace, Level::Trace)
|
||||
#endif // ELPP_COMPILER_MSVC
|
||||
#define el_resolveVALength(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N
|
||||
#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) \
|
||||
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, ...) \
|
||||
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, ...) \
|
||||
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, ...) \
|
||||
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)
|
||||
class PerformanceTrackingData {
|
||||
public:
|
||||
|
||||
Reference in New Issue
Block a user