10 #ifndef smtk_io_Logger_h
11 #define smtk_io_Logger_h
14 #include "smtk/CoreExports.h"
15 #include "smtk/SystemConfig.h"
23 #undef DEBUG // Some libraries publicly export this define when built in debug mode
29 #ifdef WARNING // Same
37 #define smtkErrorMacro(logger, x) \
40 std::stringstream s1; \
42 (logger).addRecord(smtk::io::Logger::Error, s1.str(), __FILE__, __LINE__); \
49 #define smtkWarningMacro(logger, x) \
52 std::stringstream s1; \
54 (logger).addRecord(smtk::io::Logger::Warning, s1.str(), __FILE__, __LINE__); \
61 #define smtkDebugMacro(logger, x) \
64 std::stringstream s1; \
66 (logger).addRecord(smtk::io::Logger::Debug, s1.str(), __FILE__, __LINE__); \
76 #define smtkInfoMacro(logger, x) \
79 std::stringstream s1; \
81 (logger).addRecord(smtk::io::Logger::Info, s1.str()); \
110 Severity severity{ Info };
112 std::string fileName;
113 unsigned int lineNumber{ 0 };
114 Record(Severity s,
const std::string& m,
const std::string& f =
"",
unsigned int l = 0)
127 : m_hasErrors(logger.m_hasErrors)
128 , m_records(logger.m_records)
135 std::size_t numberOfRecords()
const {
return m_records.size(); }
137 bool hasErrors()
const {
return m_hasErrors; }
138 void clearErrors() { m_hasErrors =
false; }
141 addRecord(Severity s,
const std::string& m,
const std::string& fname =
"",
unsigned int line = 0);
147 std::vector<Record> records()
const;
149 Record record(std::size_t i)
const;
151 static std::string toString(
const Record& record,
bool includeSourceLoc =
false);
152 std::string toString(std::size_t i,
bool includeSourceLoc =
false)
const;
153 std::string toString(std::size_t i, std::size_t j,
bool includeSourceLoc =
false)
const;
155 std::string toHTML(std::size_t i, std::size_t j,
bool includeSourceLoc)
const;
158 std::string convertToString(
bool includeSourceLoc =
false)
const;
159 std::string convertToHTML(
bool includeSourceLoc =
false)
const;
162 void append(
const Logger& l);
164 static std::string severityAsString(Severity s);
166 void setFlushToStream(std::ostream* output,
bool ownFile,
bool includePast);
167 bool setFlushToFile(std::string filename,
bool includePast);
168 void setFlushToStdout(
bool includePast);
169 void setFlushToStderr(
bool includePast);
171 void setCallback(std::function<
void()> fn);
174 void flushRecordsToStream(std::size_t beginRec, std::size_t endRec);
175 std::string toStringInternal(std::size_t i, std::size_t j,
bool includeSourceLoc =
false)
const;
177 bool m_hasErrors{
false };
178 std::vector<Record> m_records;
179 std::ostream* m_stream{
nullptr };
180 bool m_ownStream{
false };
181 std::function<void()> m_callback;
184 static Logger m_instance;
185 mutable std::mutex m_mutex;
189 void to_json(J& json,
const Logger::Record& rec)
191 json = { {
"severity", rec.severity },
192 {
"message", rec.message },
193 {
"file", rec.fileName },
194 {
"line", rec.lineNumber } };