1
0
mirror of https://github.com/vcmi/vcmi.git synced 2026-05-16 09:28:24 +02:00

Finished conversion to new logging API

* removed logger streams
* (float3|int3)::operator() -> (float3|int3)::toString(), it was too ugly and confusing.
This commit is contained in:
AlexVinS
2017-08-11 20:03:05 +03:00
parent f2de6d1122
commit 15138c23de
85 changed files with 543 additions and 669 deletions
+131 -78
View File
@@ -49,91 +49,144 @@ namespace ELogLevel
namespace vstd
{
class DLL_LINKAGE CLoggerBase
class DLL_LINKAGE CLoggerBase
{
public:
virtual ~CLoggerBase();
virtual void log(ELogLevel::ELogLevel level, const std::string & message) const = 0;
virtual void log(ELogLevel::ELogLevel level, const boost::format & fmt) const = 0;
/// Returns true if a debug/trace log message will be logged, false if not.
/// Useful if performance is important and concatenating the log message is a expensive task.
virtual bool isDebugEnabled() const = 0;
virtual bool isTraceEnabled() const = 0;
template<typename T, typename ... Args>
void log(ELogLevel::ELogLevel level, const std::string & format, T t, Args ... args) const
{
public:
virtual ~CLoggerBase(){};
virtual void log(ELogLevel::ELogLevel level, const std::string & message) const = 0;
virtual void log(ELogLevel::ELogLevel level, const boost::format & fmt) const = 0;
template<typename T, typename ... Args>
void log(ELogLevel::ELogLevel level, const std::string & format, T t, Args ... args) const
try
{
boost::format fmt(format);
makeFormat(fmt, t, args...);
log(level, fmt);
}
/// Log methods for various log levels
inline void error(const std::string & message) const
catch(...)
{
log(ELogLevel::ERROR, message);
};
template<typename T, typename ... Args>
void error(const std::string & format, T t, Args ... args) const
{
log(ELogLevel::ERROR, format, t, args...);
log(ELogLevel::ERROR, "Log formatting failed, format was:");
log(ELogLevel::ERROR, format);
}
}
inline void warn(const std::string & message) const
{
log(ELogLevel::WARN, message);
};
template<typename T, typename ... Args>
void warn(const std::string & format, T t, Args ... args) const
{
log(ELogLevel::WARN, format, t, args...);
}
inline void info(const std::string & message) const
{
log(ELogLevel::INFO, message);
};
template<typename T, typename ... Args>
void info(const std::string & format, T t, Args ... args) const
{
log(ELogLevel::INFO, format, t, args...);
}
inline void debug(const std::string & message) const
{
log(ELogLevel::DEBUG, message);
};
template<typename T, typename ... Args>
void debug(const std::string & format, T t, Args ... args) const
{
log(ELogLevel::DEBUG, format, t, args...);
}
inline void trace(const std::string & message) const
{
log(ELogLevel::TRACE, message);
};
template<typename T, typename ... Args>
void trace(const std::string & format, T t, Args ... args) const
{
log(ELogLevel::TRACE, format, t, args...);
}
private:
template <typename T>
void makeFormat(boost::format & fmt, T t) const
{
fmt % t;
}
template <typename T, typename ... Args>
void makeFormat(boost::format & fmt, T t, Args ... args) const
{
fmt % t;
makeFormat(fmt, args...);
}
/// Log methods for various log levels
inline void error(const std::string & message) const
{
log(ELogLevel::ERROR, message);
};
}
template<typename T, typename ... Args>
void error(const std::string & format, T t, Args ... args) const
{
log(ELogLevel::ERROR, format, t, args...);
}
inline void warn(const std::string & message) const
{
log(ELogLevel::WARN, message);
};
template<typename T, typename ... Args>
void warn(const std::string & format, T t, Args ... args) const
{
log(ELogLevel::WARN, format, t, args...);
}
inline void info(const std::string & message) const
{
log(ELogLevel::INFO, message);
};
template<typename T, typename ... Args>
void info(const std::string & format, T t, Args ... args) const
{
log(ELogLevel::INFO, format, t, args...);
}
inline void debug(const std::string & message) const
{
log(ELogLevel::DEBUG, message);
};
template<typename T, typename ... Args>
void debug(const std::string & format, T t, Args ... args) const
{
log(ELogLevel::DEBUG, format, t, args...);
}
inline void trace(const std::string & message) const
{
log(ELogLevel::TRACE, message);
};
template<typename T, typename ... Args>
void trace(const std::string & format, T t, Args ... args) const
{
log(ELogLevel::TRACE, format, t, args...);
}
private:
template <typename T>
void makeFormat(boost::format & fmt, T t) const
{
fmt % t;
}
template <typename T, typename ... Args>
void makeFormat(boost::format & fmt, T t, Args ... args) const
{
fmt % t;
makeFormat(fmt, args...);
}
};
/// RAII class for tracing the program execution.
/// It prints "Leaving function XYZ" automatically when the object gets destructed.
class DLL_LINKAGE CTraceLogger
{
public:
CTraceLogger(const CLoggerBase * logger, const std::string & beginMessage, const std::string & endMessage);
CTraceLogger(const CTraceLogger & other) = delete;
~CTraceLogger();
private:
const CLoggerBase * logger;
std::string endMessage;
};
}//namespace vstd
/// Macros for tracing the control flow of the application conveniently. If the LOG_TRACE macro is used it should be
/// the first statement in the function. Logging traces via this macro have almost no impact when the trace is disabled.
///
#define RAII_TRACE(logger, onEntry, onLeave) \
std::unique_ptr<vstd::CTraceLogger> ctl00; \
if(logger->isTraceEnabled()) \
ctl00 = make_unique<vstd::CTraceLogger>(logger, onEntry, onLeave);
#define LOG_TRACE(logger) RAII_TRACE(logger, \
boost::str(boost::format("Entering %s.") % BOOST_CURRENT_FUNCTION), \
boost::str(boost::format("Leaving %s.") % BOOST_CURRENT_FUNCTION))
#define LOG_TRACE_PARAMS(logger, formatStr, params) RAII_TRACE(logger, \
boost::str(boost::format("Entering %s: " + std::string(formatStr) + ".") % BOOST_CURRENT_FUNCTION % params), \
boost::str(boost::format("Leaving %s.") % BOOST_CURRENT_FUNCTION))
extern DLL_LINKAGE vstd::CLoggerBase * logGlobal;
extern DLL_LINKAGE vstd::CLoggerBase * logBonus;
extern DLL_LINKAGE vstd::CLoggerBase * logNetwork;
extern DLL_LINKAGE vstd::CLoggerBase * logAi;
extern DLL_LINKAGE vstd::CLoggerBase * logAnim;