8 #include "utility/stringutils.h"
9 #include "signalslot.h"
10 #include "rtti/object.h"
19 #include <nap/datetime.h>
29 #define NAP_DECLARE_LOG_LEVEL(LEVEL, NAME) \
30 static LogLevel& NAME##Level() \
32 static LogLevel lvl(#NAME, LEVEL); \
36 template<typename T> \
37 static void NAME(T&& msg) \
39 instance().log(LogMessage(NAME##Level(), std::forward<T>(msg))); \
42 static void NAME(const rtti::Object& obj, const std::string& msg) \
44 instance().log(LogMessage(NAME##Level(), utility::stringFormat("%s: %s", obj.mID.c_str(), msg.c_str()))); \
47 template <typename... Args> \
48 static void NAME(const char* msg, Args&&... args) \
50 instance().log(LogMessage(NAME##Level(), utility::stringFormat(msg, std::forward<Args>(args)...))); \
53 template <typename... Args> \
54 static void NAME(rtti::Object& obj, const char* msg, Args&&... args) \
56 std::string msg_str = utility::stringFormat("%s: %s", obj.mID.c_str(), msg); \
57 instance().log(LogMessage(NAME##Level(), utility::stringFormat(msg_str.c_str(), std::forward<Args>(args)...))); \
77 LogLevel(
const std::string& name,
int level) : mName(name), mLevel(level) {}
82 int level()
const {
return mLevel; }
83 const std::string&
name()
const {
return mName; }
122 const std::string&
text()
const {
return mMessage; }
131 const std::string mMessage;
217 void setCurrentLevel(
const LogLevel& level);
222 static Logger& instance();
228 NAP_DECLARE_LOG_LEVEL(50, fine)
231 NAP_DECLARE_LOG_LEVEL(100, debug)
234 NAP_DECLARE_LOG_LEVEL(200, info)
237 NAP_DECLARE_LOG_LEVEL(300, warn)
240 NAP_DECLARE_LOG_LEVEL(400, error)
243 NAP_DECLARE_LOG_LEVEL(500, fatal)
248 static const std::vector<const
LogLevel*>& getLevels()
253 static std::vector<const LogLevel*> lvls = {
268 static const LogLevel* getLevel(
const std::string& name);
274 static void addFileHandler(
const std::string& filename);
283 static void logToDirectory(
const std::string& directory,
const std::string& prefix =
"log");
290 void addHandler(std::unique_ptr<LogHandler> handler);
296 void operator=(
Logger const&);
302 const LogLevel* mLevel;
303 std::vector<std::unique_ptr<LogHandler>> mHandlers{};
322 std::mutex mOutStreamMutex;
346 const std::string mFilename;
347 std::unique_ptr<std::thread> mWriteThread;
348 std::queue<LogMessage> mMessages;
349 std::mutex mQueueMutex;
350 std::atomic<bool> mRunning;