v2.0.0
Loading...
Searching...
No Matches
mne_logger.cpp
Go to the documentation of this file.
1//=============================================================================================================
18
19//=============================================================================================================
20// INCLUDES
21//=============================================================================================================
22
23#include <iostream>
24#include <string>
25#include "mne_logger.h"
26
27//=============================================================================================================
28// QT INCLUDES
29//=============================================================================================================
30
31#include <QtGlobal>
32#include <QDateTime>
33#include <QMutexLocker>
34
35//=============================================================================================================
36// USED NAMESPACES
37//=============================================================================================================
38
39using namespace UTILSLIB;
40
41//=============================================================================================================
42// Definitions
43//=============================================================================================================
44
45#ifdef WIN32
46 #include <wchar.h>
47 #include <windows.h>
48 #define COLOR_INFO "\033[32;1m"
49 #define COLOR_DEBUG "\033[32;1m"
50 #define COLOR_WARN "\033[33;1m"
51 #define COLOR_CRITICAL "\033[31;1m"
52 #define COLOR_FATAL "\033[33;1m"
53 #define COLOR_RESET "\033[0m"
54#else
55 #define COLOR_INFO "\033[32;1m" //green
56 #define COLOR_DEBUG "\033[32;1m" //green
57 #define COLOR_WARN "\033[33;1m" //yellow
58 #define COLOR_CRITICAL "\033[31;1m" //red
59 #define COLOR_FATAL "\033[33;1m" //yellow
60 #define COLOR_RESET "\033[0m" //reset
61#endif
62
63std::mutex MNELogger::m_mutex;
64
65//=============================================================================================================
66// DEFINE MEMBER METHODS
67//=============================================================================================================
68
69void MNELogger::customLogWriter(QtMsgType type,
70 const QMessageLogContext &context,
71 const QString &msg)
72{
73 Q_UNUSED(context)
74
75 // Map Qt message type to numeric level (must match CMake MNE_LOG_LEVEL values)
76 // 0=DEBUG, 1=INFO, 2=WARN, 3=CRIT, 4=FATAL
77 int msgLevel = 0;
78 switch(type) {
79 case QtDebugMsg: msgLevel = 0; break;
80 case QtInfoMsg: msgLevel = 1; break;
81 case QtWarningMsg: msgLevel = 2; break;
82 case QtCriticalMsg: msgLevel = 3; break;
83 case QtFatalMsg: msgLevel = 4; break;
84 default: msgLevel = 0; break;
85 }
86
87#ifdef MNE_LOG_LEVEL
88 if (msgLevel < MNE_LOG_LEVEL)
89 return;
90#endif
91
92 std::string text = msg.toStdString();
93
94 std::lock_guard<std::mutex> lock(m_mutex);
95
96#ifdef MNE_LOG_MODE_FORMATTED
97 static bool s_startOfLine = true;
98
99 // Determine color and level tag
100 const char* color = COLOR_RESET;
101 const char* level = "";
102 switch(type) {
103 case QtDebugMsg: color = COLOR_DEBUG; level = "[DEBUG] "; break;
104 case QtInfoMsg: color = COLOR_INFO; level = "[INFO] "; break;
105 case QtWarningMsg: color = COLOR_WARN; level = "[WARN] "; break;
106 case QtCriticalMsg: color = COLOR_CRITICAL; level = "[CRIT] "; break;
107 case QtFatalMsg: color = COLOR_FATAL; level = "[FATAL] "; break;
108 default: level = ""; break;
109 }
110
111 // Uncomment the following line to include date/time in log prefix:
112 // std::string sDateTime = QDateTime::currentDateTime().toString("dd/MM/yyyy hh:mm:ss.z ").toStdString();
113 std::string sDateTime;
114
115 std::string prefix = std::string(color) + sDateTime + level + COLOR_RESET;
116
117 // Walk through the message character by character.
118 // Print the prefix only at the start of each new line.
119 for (size_t i = 0; i < text.size(); ++i) {
120 if (s_startOfLine && text[i] != '\n') {
121 std::cout << prefix;
122 s_startOfLine = false;
123 }
124 std::cout << text[i];
125 if (text[i] == '\n') {
126 s_startOfLine = true;
127 }
128 }
129
130 if (text.empty() || text.back() != '\n') {
131 std::cout << '\n';
132 s_startOfLine = true;
133 }
134#else
135 // PLAIN mode: raw text, like printf
136 std::cout << text;
137 if (text.empty() || text.back() != '\n') {
138 std::cout << '\n';
139 }
140#endif
141
142 std::cout.flush();
143}
Custom Qt message handler that adds ANSI colour, timestamps and source-location tags to qDebug/qWarni...
#define COLOR_INFO
#define COLOR_RESET
#define COLOR_DEBUG
#define COLOR_CRITICAL
#define COLOR_WARN
#define COLOR_FATAL
Shared utilities (I/O helpers, spectral analysis, layout management, warp algorithms).
static void customLogWriter(QtMsgType type, const QMessageLogContext &context, const QString &msg)