-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathLogger.cpp
More file actions
133 lines (104 loc) · 3.13 KB
/
Logger.cpp
File metadata and controls
133 lines (104 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include "Logger.h"
//define static variables
QFile* Logger::logFile = nullptr;
QMutex Logger::mutex;
QString Logger::logs;
Logger* Logger::s_instance = nullptr;
Logger* Logger::instance() {
if (!s_instance) s_instance = new Logger();
return s_instance;
}
Logger::Logger(QObject *parent)
: QObject(parent)
{
}
void Logger::init()
{
//get file name
QString basePath = devBuildRoot();
QString logDir = basePath + "/log";
QDir().mkpath(logDir);
QDateTime time = QDateTime::currentDateTime();
QString name = logDir + "/" + QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss") + ".log";
//open file
logFile = new QFile(name);
if (!logFile->open(QIODevice::WriteOnly | QIODevice::Text)) {
qDebug() << "Failed to open file:" << logFile->errorString();
return;
}
qInstallMessageHandler(newEntry);
}
void Logger::close()
{
QMutexLocker locker(&mutex);
//pass all logs
QTextStream out(logFile);
out << logs << Qt::endl;
out.flush();
//clear message handler
qInstallMessageHandler(0);
//close file
logFile->flush();
logFile->close();
//cleaner way to do this with Q?
delete logFile;
logFile = nullptr;
}
QString Logger::typeToString(QtMsgType type) {
switch(type) {
case QtDebugMsg: return "Debug";
case QtInfoMsg: return "Info";
case QtWarningMsg: return "Warning";
case QtCriticalMsg: return "Critical";
case QtFatalMsg: return "Fatal";
default: return "Unknown";
}
return "Info";
}
void Logger::newEntry(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
//get message timestamp
QDateTime time = QDateTime::currentDateTime();
//ensure thread safety
QMutexLocker locker(&mutex);
QString entry;
//get type of message and add in outptut
switch(type)
{
case QtDebugMsg: entry += "[Debug] "; break;
case QtInfoMsg: entry += "[Info] "; break;
case QtWarningMsg: entry += "[Warning] "; break;
case QtCriticalMsg: entry += "[Critical] "; break;
case QtFatalMsg: entry += "[Fatal] "; break;
}
//add time to output
entry += time.toString(" yyyy.MM.dd hh:mm:ss ");
//add context to output (line and file)
entry += QString(" (%1:%2) ").arg(QFileInfo(QString::fromUtf8(context.file)).fileName()).arg(context.line);
//add message given by user
entry += msg;
entry += "\n";
//pass entry to log str
logs += entry;
Logger* instance = Logger::instance();
const QString typeStr = typeToString(type);
QMetaObject::invokeMethod(
instance,
"forwardLog",
Qt::QueuedConnection,
Q_ARG(QString, typeStr),
Q_ARG(QString, msg)
);
}
void Logger::forwardLog(const QString &type, const QString &message) {
emit logReceived(type, message);
}
QString Logger::devBuildRoot()
{
QString exeDir = QCoreApplication::applicationDirPath();
QDir dir(exeDir);
#ifdef Q_OS_MAC
dir = QDir::cleanPath(dir.dirName() + QStringLiteral("/../../../.."));
#endif
return dir.absolutePath();
}