forked from Securepoint/openvpn-client
-
Notifications
You must be signed in to change notification settings - Fork 0
/
debug.cpp
301 lines (272 loc) · 10.9 KB
/
debug.cpp
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
#include "debug.h"
/*
* Log-Klasse zum Debuggen
*
* Autor: Oliver Dehnbostel <oliver.dehnbostel @ securepoint.de>
* Erstellt am: 05.12.2011
*
*
*
* Benutzung:
*
* Init:
*
* // Pfad für die Logdatei
* Debug::setDebugPath(QCoreApplication::applicationDirPath());
* // Das DebugLevel setzten -> siehe Enum Level im namespace
* Debug::setDebugLevel(DebugLevel::Category);
* // Millisekunden anzeigen aktivieren, diese Option
* // aktiviert auch gleich enableDateTime (true);
* Debug::enableMSecs(true);
* // Das Log aktivieren
* Debug::enableDebugging(true);
*
*
* Benutzung:
*
* Hinzufügen von Kategorien:
* Debug::addCategory(QLatin1String("Name"));
* Entfernen einer Kategorie:
* Debug::endCategory();
* Entfernen aller Kategorien:
* Debug::clearCategories();
* Ausgeben einer Meldung:
* Debug::log(QString::number(3));
* oder mit Levelangabe
* Debug::log(QLatin1String("Message"), DebugLevel::Construktor);
* oder mit Levelangabe und Datei sonst ist Standard debug.txt
* Debug::log(QLatin1String("Message"), DebugLevel::Construktor, QLatin1String("datei.suffix");
*
* Kurzversionen:
* Debug::error(QLatin1String("Fehler"));
* und
* Debug::function(QLatin1String("Funktion"));
*
*
*
* Ausgabe:
* 05.12.2011 15:08:22.414 Category -> =====================================================================
* 05.12.2011 15:08:22.414 Category -> Category: Name now started.
* 05.12.2011 15:08:22.414 Category -> =====================================================================
* 05.12.2011 15:08:22.414 Comment -> Ein Kommentar
* 05.12.2011 15:08:22.414 Category -> =====================================================================
* 05.12.2011 15:08:22.414 Category -> Category: Name 2 now started.
* 05.12.2011 15:08:22.414 Category -> =====================================================================
* 05.12.2011 15:08:22.414 Comment -> In der neuen Kategorie
* 05.12.2011 15:08:22.414 Category -> =====================================================================
* 05.12.2011 15:08:22.430 Category -> Category: Name 2 now ended.
* 05.12.2011 15:08:22.430 Category -> =====================================================================
* 05.12.2011 15:08:22.430 Error -> ---------------------------------------------------------------------
* 05.12.2011 15:08:22.430 Error -> Fehlermedlung
* 05.12.2011 15:08:22.430 Error -> ---------------------------------------------------------------------
* 05.12.2011 15:08:22.430 Function -> Funktion
* 05.12.2011 15:08:22.430 Category -> =====================================================================
* 05.12.2011 15:08:22.430 Category -> Category: Push Name now ended.
* 05.12.2011 15:08:22.430 Category -> =====================================================================
*
*
* Known Bugs: Keine
*
* Änderungen: Keine
*
*
*/
// Init der statischen Member
//
// Debugging ist deaktiviert
bool Debug::debugEnabled = false;
// Einen leeren Pfad erzeigen
QString Debug::debugPath = QString ("");
// DebugLevel is None
int Debug::debugLevel = 0;
// Standardmässig wird keine Zeit erfasst
bool Debug::dateTimeEnabled = false;
bool Debug::mSecsEnabled = false;
// Eine leere List erzeugen
QStack<QString> Debug::debugCategories;
Debug::Debug()
{
}
void Debug::enableDebugging(const bool &flag)
{
// Schaltet das Debugging an oder aus
debugEnabled = flag;
}
void Debug::setDebugPath(const QString &path)
{
// Setzt den Pfad für das Debugging alle
// Dateien werden in diesem Verzeichnis abgelegt.
// Der Pfad muss für eine ordnungsgemäße Funktion gesetzt sein.
// Wenn der Pfad leer ist abbrechen
if (path.isEmpty()) {
return;
}
// Den Pfad aufbereiten
QString tmp(path);
// Backslash durch Slash ersetzen
tmp = tmp.replace("\\", "/");
// Ist das letzt Zeichen ein "/"
// Wenn nicht anfügen
if (tmp.right(1) != QLatin1String("/")) {
tmp += QLatin1String("/");
}
// Alles ok
debugPath = tmp;
}
void Debug::addCategory(const QString &cat)
{
// Fügt dem Stack eine Kategorie hinzu
// Wenn keine Kategorie übergeben wurde abbrechen
if (cat.isEmpty()) {
return;
}
// Kategorie auf den Stack legen
debugCategories.append(cat);
log (QLatin1String("====================================================================="), DebugLevel::Category);
log (QLatin1String("Category: ") + debugCategories.top() + QLatin1String(" now started."), DebugLevel::Category);
log (QLatin1String("====================================================================="), DebugLevel::Category);
}
void Debug::setDebugLevel(DebugLevel::Level level) {
// Setzt das aktuelle DebugLevel
debugLevel = level;
}
void Debug::enableDateTime(const bool &flag)
{
// Wenn die Option aktiviert ist,
// wird zu jeder Ausgabe das Datum und die Uhrzeit geschrieben
dateTimeEnabled = flag;
}
void Debug::enableMSecs(const bool &flag)
{
// Bei gesezter Option werden zusätzlich noch die Millisekunden erfasst
mSecsEnabled = flag;
// Wenn die Option aktiviert ist, muss auch die DateTime an sein.
if (flag) {
dateTimeEnabled = true;
}
}
void Debug::endCategory()
{
// Beendet eine Kategorie und nimmt diese vom Stack
if (debugCategories.size() > 0) {
// Ausgabe des Kategorienwechsel
log (QLatin1String("====================================================================="), DebugLevel::Category);
log (QLatin1String("Category: ") + debugCategories.top() + QLatin1String(" now ended."), DebugLevel::Category);
log (QLatin1String("====================================================================="), DebugLevel::Category);
debugCategories.pop();
}
}
void Debug::clearCategories()
{
// Löscht die gesamte Kategorienliste
log (QLatin1String("====================================================================="), DebugLevel::Category);
log (QLatin1String("All categories now ended."), DebugLevel::Category);
log (QLatin1String("====================================================================="), DebugLevel::Category);
debugCategories.clear();
}
void Debug::log(const QString &message, DebugLevel::Level level, const QString &filename)
{
// Schreibt die Logmeldung, wenn ein bestimmtes Level gesetzt ist
if (debugEnabled) {
// Level überprüfen
if (level <= debugLevel) {
// Soll das Datum mit erfasst werden
QString timeDate ("");
if (dateTimeEnabled) {
QString dateFormat (QLatin1String("dd.MM.yyyy hh:mm:ss"));
// Millisekunden ausgeben
if (mSecsEnabled) {
dateFormat = QLatin1String("dd.MM.yyyy hh:mm:ss.zzz");
}
timeDate = QDateTime::currentDateTime().toString(dateFormat);
}
// Ist der Pfad gefüllt
if (debugPath.isEmpty()) {
return;
}
// Ist der Pfad vorhanden
QDir debugDir (debugPath);
if(!debugDir.exists()) {
// Pfad erstellen
if (!debugDir.mkpath(debugPath)) {
// Fehler
return;
}
}
// Soll eine extra Datei erstellt werden?
QString fileName ("debug-vpn-client.txt");
if (!filename.isEmpty()) {
fileName = filename;
}
// Nun die Einrückrung
QString indent;
// Die Stackgröße spiegelt die Einrücktiefe wieder
indent = indent.fill(QChar('\t'), debugCategories.size());
// Das Level herausfinden
QString levelName ("");
switch (level) {
case DebugLevel::Error:
levelName = QLatin1String("Error");
if (debugLevel == DebugLevel::Error) {
// Die Einrücktiefe ist 0
indent.clear();
}
break;
case DebugLevel::Category:
levelName = QLatin1String("Category");
break;
case DebugLevel::Function:
levelName = QLatin1String("Function");
break;
case DebugLevel::Comment:
levelName = QLatin1String("Comment");
break;
case DebugLevel::Database:
levelName = QLatin1String("Database");
break;
case DebugLevel::Debug:
levelName = QLatin1String("Debug");
break;
case DebugLevel::Construktor:
levelName = QLatin1String("Construktor");
break;
case DebugLevel::Destruktor:
levelName = QLatin1String("Destruktor");
break;
default:
// Diesen Fall sollte es nicht geben
// Da es nur ein Flag für die Ausgabesteuerung ist
levelName = QLatin1String("ALL");
}
// LineFeed bestimmen
QLatin1String lineFeed ("\r\n");
#ifndef Q_OS_WIN32
lineFeed = QLatin1String ("\n");
#endif
// Alles bearbeitet, nun den String ausgeben
// Datei öffnen
QFile debugFile (debugPath + fileName);
if (debugFile.open(QIODevice::WriteOnly | QIODevice::Append)) {
// Datei ist offen nun schreiben
QString data (indent + timeDate + QLatin1String (" ") + levelName + QLatin1String (" -> ") + message + lineFeed);
debugFile.write(data.toAscii());
// Kurz warten
debugFile.waitForBytesWritten(1000);
// Datei wieder schließen
debugFile.close();
}
}
}
}
void Debug::error(const QString &message, const QString &filename)
{
// Wrapper für Fehlermeldungen
log (QLatin1String("---------------------------------------------------------------------"), DebugLevel::Error, filename);
log (message, DebugLevel::Error, filename);
log (QLatin1String("---------------------------------------------------------------------"), DebugLevel::Error, filename);
}
void Debug::function(const QString &message, const QString &filename)
{
// Wrapper für Funktionen
log (message, DebugLevel::Function, filename);
}