QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
LogFormatter.cc
Go to the documentation of this file.
1#include "LogFormatter.h"
2
3#include <QtCore/QJsonArray>
4#include <QtCore/QJsonDocument>
5#include <QtCore/QJsonObject>
6
7#include "LogEntry.h"
8
9namespace LogFormatter {
10
11// ---------------------------------------------------------------------------
12// Single-entry formatting
13// ---------------------------------------------------------------------------
14
15static QString escapeCsv(const QString& field)
16{
17 if (field.contains(',') || field.contains('"') || field.contains('\n')) {
18 QString escaped = field;
19 escaped.replace('"', QStringLiteral("\"\""));
20 return '"' + escaped + '"';
21 }
22 return field;
23}
24
25QString formatCsvRow(const LogEntry& entry)
26{
27 return escapeCsv(entry.timestamp.toString(Qt::ISODateWithMs)) + ',' + entry.levelLabel() + ',' +
28 escapeCsv(entry.category) + ',' + escapeCsv(entry.message) + ',' +
29 escapeCsv(entry.file) + ',' + (entry.file.isEmpty() ? QString() : QString::number(entry.line));
30}
31
32QString csvHeader()
33{
34 return QStringLiteral("timestamp,level,category,message,file,line");
35}
36
37// ---------------------------------------------------------------------------
38// Batch formatting
39// ---------------------------------------------------------------------------
40
41QByteArray format(const QList<LogEntry>& entries, int fmt)
42{
43 switch (fmt) {
44 case JSON:
45 return formatAsJson(entries);
46 case CSV:
47 return formatAsCsv(entries);
48 case JSONLines:
49 return formatAsJsonLines(entries);
50 default:
51 return formatAsText(entries);
52 }
53}
54
55QByteArray formatAsText(const QList<LogEntry>& entries)
56{
57 QByteArray result;
58 result.reserve(entries.size() * 150);
59 for (const auto& e : entries) {
60 result.append(e.formatted.toUtf8());
61 if (!e.file.isEmpty()) {
62 if (e.line > 0) {
63 result.append(QStringLiteral(" (%1:%2)").arg(e.file).arg(e.line).toUtf8());
64 } else {
65 result.append(QStringLiteral(" (%1)").arg(e.file).toUtf8());
66 }
67 }
68 result.append('\n');
69 }
70 return result;
71}
72
73QJsonObject entryToJson(const LogEntry& e, JsonSchema schema)
74{
75 if (schema == RemoteCompactSchema) {
76 return {
77 {"t", e.timestamp.toMSecsSinceEpoch()},
78 {"l", static_cast<int>(e.level)},
79 {"c", e.category},
80 {"m", e.message},
81 };
82 }
83 return {
84 {"timestamp", e.timestamp.toString(Qt::ISODateWithMs)},
85 {"level", e.levelLabel()},
86 {"category", e.category},
87 {"message", e.message},
88 };
89}
90
91QByteArray formatAsJson(const QList<LogEntry>& entries)
92{
93 QJsonArray array;
94 for (const auto& e : entries) {
95 array.append(entryToJson(e));
96 }
97 return QJsonDocument(array).toJson(QJsonDocument::Indented);
98}
99
100QByteArray formatAsCsv(const QList<LogEntry>& entries)
101{
102 QByteArray result;
103 result.reserve(entries.size() * 100);
104 result.append(csvHeader().toUtf8());
105 result.append('\n');
106 for (const auto& e : entries) {
107 result.append(formatCsvRow(e).toUtf8());
108 result.append('\n');
109 }
110 return result;
111}
112
113QByteArray formatAsJsonLines(const QList<LogEntry>& entries)
114{
115 QByteArray result;
116 result.reserve(entries.size() * 150);
117 for (const auto& e : entries) {
118 result.append(QJsonDocument(entryToJson(e)).toJson(QJsonDocument::Compact));
119 result.append('\n');
120 }
121 return result;
122}
123
124} // namespace LogFormatter
QByteArray formatAsText(const QList< LogEntry > &entries)
QJsonObject entryToJson(const LogEntry &e, JsonSchema schema)
QString formatCsvRow(const LogEntry &entry)
QByteArray formatAsCsv(const QList< LogEntry > &entries)
QByteArray formatAsJson(const QList< LogEntry > &entries)
QByteArray format(const QList< LogEntry > &entries, int fmt)
QByteArray formatAsJsonLines(const QList< LogEntry > &entries)
QString csvHeader()
static QString escapeCsv(const QString &field)
QString file
Definition LogEntry.h:41
int line
Definition LogEntry.h:46
QString message
Definition LogEntry.h:40
QDateTime timestamp
Definition LogEntry.h:37
QString levelLabel() const
Definition LogEntry.cc:7
Level level
Definition LogEntry.h:38
QString category
Definition LogEntry.h:39