39 #include <unordered_map> 41 #ifdef USE_EXPLICIT_MOVE_ 46 #include <type_traits> 48 #define BOOST_NO_CXX11_SCOPED_ENUMS 49 #include <boost/filesystem.hpp> 50 #include <boost/throw_exception.hpp> 102 std::hash<enumType_t> h;
141 void operator()(std::ostream& os, std::time_t timeStamp,
const std::string& message,
142 const std::string& logMsgLevel,
const std::string& file,
143 const std::string&
function,
int lineNo,
const std::thread::id& threadID)
const;
149 BYTES_IN_MEBIBYTE = 1024 * 1024
186 LogQueueMessage(
const std::string& message, time_t timeStamp,
const std::string& file,
187 const std::string&
function,
int lineNo,
const std::thread::id& threadID,
195 #ifdef USE_EXPLICIT_MOVE_ 210 const std::string& Message()
const;
215 time_t TimeStamp()
const;
220 const std::string& File()
const;
225 const std::string& Function()
const;
235 const std::thread::id& ThreadID()
const;
244 std::string m_message{};
246 time_t m_timeStamp{0};
248 std::string m_file{};
250 std::string m_function{};
254 std::thread::id m_threadID{};
289 #ifdef USE_DEFAULT_CONSTRUCTOR_ 291 : m_unknownLogMsgLevel(
"?")
293 InitialiseLogMessageLevelLookupMap();
308 DebugLog(
const std::string& softwareVersion,
const std::string& logFolderPath,
309 const std::string& logName,
long maxLogSize = 5 * BYTES_IN_MEBIBYTE)
311 #ifdef USE_DEFAULT_CONSTRUCTOR_
312 m_unknownLogMsgLevel(
"?")
315 m_maxLogSize(maxLogSize)
316 , m_softwareVersion(softwareVersion)
317 , m_logFilePath(logFolderPath)
318 , m_oldLogFilePath(logFolderPath)
320 m_logFilePath.append(logName);
321 m_logFilePath.append(
".txt");
323 m_oldLogFilePath.append(logName);
324 m_oldLogFilePath.append(
"_old.txt");
326 #ifdef USE_DEFAULT_CONSTRUCTOR_ 327 InitialiseLogMessageLevelLookupMap();
329 RegisterLogQueueMessageId();
330 OpenOfStream(m_logFilePath, eFileOpenOptions::append_file);
345 m_logMsgQueueThread.reset();
363 void Instantiate(
const std::string& softwareVersion,
const std::string& logFolderPath,
364 const std::string& logName,
long maxLogSize = 5 * BYTES_IN_MEBIBYTE)
366 m_maxLogSize = maxLogSize;
368 if ((m_softwareVersion !=
"") || (m_logFilePath !=
"") || (m_oldLogFilePath !=
""))
370 BOOST_THROW_EXCEPTION(std::runtime_error(
"DebugLog already instantiated"));
373 m_softwareVersion = softwareVersion;
374 m_logFilePath = logFolderPath;
375 m_oldLogFilePath = logFolderPath;
377 m_logFilePath.append(logName);
378 m_logFilePath.append(
".txt");
380 m_oldLogFilePath.append(logName);
381 m_oldLogFilePath.append(
"_old.txt");
383 RegisterLogQueueMessageId();
384 OpenOfStream(m_logFilePath, eFileOpenOptions::append_file);
400 std::lock_guard<std::mutex> lock{m_mutex};
402 if (!IsLogMsgLevelFilterSetNoMutex(logMessageLevel))
404 m_logMsgFilterSet.insert(logMessageLevel);
420 std::lock_guard<std::mutex> lock{m_mutex};
422 if (IsLogMsgLevelFilterSetNoMutex(logMessageLevel))
424 m_logMsgFilterSet.insert(logMessageLevel);
435 std::lock_guard<std::mutex> lock{m_mutex};
436 m_logMsgFilterSet.clear();
447 using std::chrono::system_clock;
448 time_t messageTime = system_clock::to_time_t(system_clock::now());
449 std::thread::id noThread;
471 if (!IsLogMsgLevelFilterSet(logMsgLevel))
473 using std::chrono::system_clock;
474 time_t messageTime = system_clock::to_time_t(system_clock::now());
480 std::this_thread::get_id(),
486 #ifdef USE_DEFAULT_CONSTRUCTOR_ 488 void InitialiseLogMessageLevelLookupMap()
506 m_logMsgQueueThread->RegisterMessageHandler(
507 dl_private::MESSAGE_ID,
517 return dl_private::MESSAGE_ID;
526 CheckLogFileSize(static_cast<long>(message.
Message().size()));
527 WriteMessageToLog(std::forward<dl_private::LogQueueMessage>(message));
537 return m_logMsgLevelLookup.count(logMessageLevel) > 0;
546 return IsLogMsgLevelInLookup(logMessageLevel)
547 ? m_logMsgLevelLookup.find(logMessageLevel)->second
548 : m_unknownLogMsgLevel;
557 return (m_logMsgFilterSet.find(logMessageLevel) != m_logMsgFilterSet.end());
566 std::lock_guard<std::mutex> lock{m_mutex};
567 return IsLogMsgLevelFilterSetNoMutex(logMessageLevel);
584 if (m_ofStream.is_open())
589 m_ofStream.open(filePath,
590 fileOptions == eFileOpenOptions::truncate_file ? std::ofstream::trunc
591 : std::ofstream::app);
593 using std::chrono::system_clock;
594 time_t messageTime = system_clock::to_time_t(system_clock::now());
595 std::thread::id noThread;
599 if (m_softwareVersion !=
"")
601 std::string message(
"Software Version ");
602 message += m_softwareVersion;
610 if (!m_ofStream.is_open())
615 using std::chrono::system_clock;
616 time_t messageTime = system_clock::to_time_t(system_clock::now());
617 std::thread::id noThread;
628 if (!m_ofStream.is_open())
633 auto pos =
static_cast<long>(m_ofStream.tellp());
635 if ((MaxLogSize() - pos) < requiredSpace)
638 boost::filesystem::copy_file(m_logFilePath,
640 boost::filesystem::copy_option::overwrite_if_exists);
641 OpenOfStream(m_logFilePath, eFileOpenOptions::truncate_file);
650 m_logFormatter(m_ofStream,
651 logMessage.TimeStamp(),
652 logMessage.Message(),
653 GetLogMsgLevelAsString(logMessage.ErrorLevel()),
655 logMessage.Function(),
657 logMessage.ThreadID());
664 #ifdef USE_DEFAULT_CONSTRUCTOR_ 666 std::string m_unknownLogMsgLevel;
668 std::unordered_map<eLogMessageLevel, std::string> m_logMsgLevelLookup;
671 std::string m_unknownLogMsgLevel{
"?"};
673 std::unordered_map<eLogMessageLevel, std::string> m_logMsgLevelLookup{
682 std::set<eLogMessageLevel> m_logMsgFilterSet{};
684 Formatter m_logFormatter{};
686 long m_maxLogSize{5 * BYTES_IN_MEBIBYTE};
688 std::ofstream m_ofStream{};
690 std::string m_softwareVersion{};
692 std::string m_logFilePath{};
694 std::string m_oldLogFilePath{};
698 std::unique_ptr<log_msg_queue> m_logMsgQueueThread{
Warning level defined for message.
~DebugLog()
Destructor.
Definition: DebugLog.h:341
const std::string & GetLogMsgLevelAsString(eLogMessageLevel logMessageLevel) const
Get message level as a string.
Definition: DebugLog.h:544
Error level defined for message.
bool MessageHandler(dl_private::LogQueueMessage &message)
Method to process message.
Definition: DebugLog.h:524
bool IsLogMsgLevelFilterSetNoMutex(eLogMessageLevel logMessageLevel) const
Is message level in filter set (no mutex).
Definition: DebugLog.h:555
void ClearLogMsgLevelFilters()
Clear all message levels from filter.
Definition: DebugLog.h:433
static int MessageDecoder(const dl_private::LogQueueMessage &)
Method to decode message ID.
Definition: DebugLog.h:515
The std namespace.
Definition: DebugLog.h:81
void AddLogMessage(const std::string &message)
Add message to the log file.
Definition: DebugLog.h:445
eMsgId
Static constant defining message ID for log messages.
Definition: DebugLog.h:156
std::size_t result_t
Typedef for result type.
Definition: DebugLog.h:90
void CheckLogFileSize(long requiredSpace)
Check size of current log file.
Definition: DebugLog.h:626
File containing declaration of MessageQueueThread class.
const std::string & Message() const
Get message string.
Definition: DebugLog.cpp:130
std::mutex m_mutex
Mutex to lock access.
Definition: DebugLog.h:663
void RemoveLogMsgLevelFilter(eLogMessageLevel logMessageLevel)
Remove level from filter.
Definition: DebugLog.h:418
eDefLogSize
Static constant defining number of bytes in a mebibyte.
Definition: DebugLog.h:147
The core_lib namespace.
Definition: AsioDefines.h:59
TYPENAME_DECL_ std::underlying_type< argument_t >::type enumType_t
Typedef for underlying type.
Definition: DebugLog.h:92
No level defined for message.
void AddLogMsgLevelFilter(eLogMessageLevel logMessageLevel)
Add level to filter.
Definition: DebugLog.h:398
DebugLog class.
Definition: DebugLog.h:276
bool IsLogMsgLevelInLookup(eLogMessageLevel logMessageLevel) const
Is message level in map.
Definition: DebugLog.h:535
void AddLogMessage(const std::string &message, const std::string &file, const std::string &function, int lineNo, eLogMessageLevel logMsgLevel)
Add message to the log file.
Definition: DebugLog.h:468
void OpenOfStream(const std::string &filePath, eFileOpenOptions fileOptions)
Open file stream.
Definition: DebugLog.h:582
eLogMessageLevel
Enumeration containing log message level options.
Definition: DebugLog.h:61
File containing declaration of DLL import/export control defines.
long MaxLogSize() const
Get the max log size in bytes.
Definition: DebugLog.h:499
Debug level defined for message.
void WriteMessageToLog(dl_private::LogQueueMessage &&logMessage)
Write log message to file stream.
Definition: DebugLog.h:648
bool IsLogMsgLevelFilterSet(eLogMessageLevel logMessageLevel) const
Is message level in filter set (with mutex).
Definition: DebugLog.h:564
DebugLog(const std::string &softwareVersion, const std::string &logFolderPath, const std::string &logName, long maxLogSize=5 *BYTES_IN_MEBIBYTE)
Initialisation constructor.
Definition: DebugLog.h:308
Fatal level defined for message.
void Instantiate(const std::string &softwareVersion, const std::string &logFolderPath, const std::string &logName, long maxLogSize=5 *BYTES_IN_MEBIBYTE)
Instantiate a previously default constructed DebugLog object.
Definition: DebugLog.h:363
result_t operator()(const argument_t &a) const
Function operator to perform the hash.
Definition: DebugLog.h:99
Option to truncate file when opened.
Definition: DebugLog.h:573
eFileOpenOptions
Enumeration containing file opening options.
Definition: DebugLog.h:570
Log Queue Message class.
Definition: DebugLog.h:168
void RegisterLogQueueMessageId()
Register the log queue message ID.
Definition: DebugLog.h:504
Message Queue Thread.
Definition: MessageQueueThread.h:68
Info level defined for message.
void CloseOfStream()
Close file stream.
Definition: DebugLog.h:608