10 #ifndef smtk_io_Logger_h
11 #define smtk_io_Logger_h
14 #include "smtk/CoreExports.h"
15 #include "smtk/SystemConfig.h"
16 #include "smtk/common/Deprecation.h"
24 #undef DEBUG // Some libraries publicly export this define when built in debug mode
30 #ifdef WARNING // Same
38 #define smtkErrorMacro(logger, x) \
41 std::stringstream s1; \
43 (logger).addRecord(smtk::io::Logger::Error, s1.str(), __FILE__, __LINE__); \
50 #define smtkWarningMacro(logger, x) \
53 std::stringstream s1; \
55 (logger).addRecord(smtk::io::Logger::Warning, s1.str(), __FILE__, __LINE__); \
62 #define smtkDebugMacro(logger, x) \
65 std::stringstream s1; \
67 (logger).addRecord(smtk::io::Logger::Debug, s1.str(), __FILE__, __LINE__); \
77 #define smtkInfoMacro(logger, x) \
80 std::stringstream s1; \
82 (logger).addRecord(smtk::io::Logger::Info, s1.str()); \
119 DEBUG SMTK_DEPRECATED_IN_22_02(
"Use `Debug`") = Debug,
120 INFO SMTK_DEPRECATED_IN_22_02(
"Use `Info`") = Info,
121 WARNING SMTK_DEPRECATED_IN_22_02(
"Use `Warning`") = Warning,
122 ERROR SMTK_DEPRECATED_IN_22_02(
"Use `Error`") = Error,
123 FATAL SMTK_DEPRECATED_IN_22_02(
"Use `Fatal`") = Fatal
129 Severity severity{ Info };
131 std::string fileName;
132 unsigned int lineNumber{ 0 };
133 Record(Severity s,
const std::string& m,
const std::string& f =
"",
unsigned int l = 0)
146 : m_hasErrors(logger.m_hasErrors)
147 , m_records(logger.m_records)
154 std::size_t numberOfRecords()
const {
return m_records.size(); }
156 bool hasErrors()
const {
return m_hasErrors; }
157 void clearErrors() { m_hasErrors =
false; }
160 addRecord(Severity s,
const std::string& m,
const std::string& fname =
"",
unsigned int line = 0);
166 std::vector<Record> records()
const;
168 Record record(std::size_t i)
const;
170 static std::string toString(
const Record& record,
bool includeSourceLoc =
false);
171 std::string toString(std::size_t i,
bool includeSourceLoc =
false)
const;
172 std::string toString(std::size_t i, std::size_t j,
bool includeSourceLoc =
false)
const;
174 std::string toHTML(std::size_t i, std::size_t j,
bool includeSourceLoc)
const;
177 std::string convertToString(
bool includeSourceLoc =
false)
const;
178 std::string convertToHTML(
bool includeSourceLoc =
false)
const;
181 void append(
const Logger& l);
183 static std::string severityAsString(Severity s);
185 void setFlushToStream(std::ostream* output,
bool ownFile,
bool includePast);
186 bool setFlushToFile(std::string filename,
bool includePast);
187 void setFlushToStdout(
bool includePast);
188 void setFlushToStderr(
bool includePast);
190 void setCallback(std::function<
void()> fn);
193 void flushRecordsToStream(std::size_t beginRec, std::size_t endRec);
194 std::string toStringInternal(std::size_t i, std::size_t j,
bool includeSourceLoc =
false)
const;
196 bool m_hasErrors{
false };
197 std::vector<Record> m_records;
198 std::ostream* m_stream{
nullptr };
199 bool m_ownStream{
false };
200 std::function<void()> m_callback;
203 static Logger m_instance;
204 mutable std::mutex m_mutex;
208 void to_json(J& json,
const Logger::Record& rec)
210 json = { {
"severity", rec.severity },
211 {
"message", rec.message },
212 {
"file", rec.fileName },
213 {
"line", rec.lineNumber } };