Add timestamps to app logs

This commit is contained in:
Michael Zanetti 2021-11-30 00:46:14 +01:00
parent 76622412c1
commit 0fe17917c9
3 changed files with 27 additions and 19 deletions

View File

@ -207,6 +207,8 @@ void AppLogController::append(const QString &category, const QString &message, L
return; return;
} }
QDateTime timestamp = QDateTime::currentDateTime();
if (m_logFile.isOpen()) { if (m_logFile.isOpen()) {
QHash<LogLevel, QString> t = { QHash<LogLevel, QString> t = {
{LogLevelDebug, "D"}, {LogLevelDebug, "D"},
@ -214,12 +216,12 @@ void AppLogController::append(const QString &category, const QString &message, L
{LogLevelWarning, "W"}, {LogLevelWarning, "W"},
{LogLevelCritical, "C"} {LogLevelCritical, "C"}
}; };
QString line = QString("%0: %1: %2\n").arg(t.value(level), category, message); QString line = QString("%0:%1:%2: %3\n").arg(timestamp.toString("yyyy-MM-dd hh:mm:ss.zzz"), t.value(level), category, message);
m_logFile.write(line.toUtf8()); m_logFile.write(line.toUtf8());
m_logFile.flush(); m_logFile.flush();
} }
emit messageAdded(category, message, level); emit messageAdded(timestamp, category, message, level);
} }
void AppLogController::updateFilters() void AppLogController::updateFilters()
@ -282,24 +284,20 @@ LogMessages::LogMessages(QObject *parent):
while (!f.atEnd()) { while (!f.atEnd()) {
QByteArray line = f.readLine().trimmed(); QByteArray line = f.readLine().trimmed();
QList<QByteArray> parts = line.split(':'); QList<QByteArray> parts = line.split(':');
if (parts.length() < 2) { if (parts.length() < 6) {
continue; continue;
} }
LogMessage message; LogMessage message;
QString timestampString = parts.takeFirst();
timestampString.append(":" + parts.takeFirst());
timestampString.append(":" + parts.takeFirst());
message.timestamp = QDateTime::fromString(timestampString, "yyyy-MM-dd hh:mm:ss.zzz");
message.level = map.value(parts.takeFirst()); message.level = map.value(parts.takeFirst());
message.category = parts.takeFirst(); message.category = parts.takeFirst();
message.message = parts.join(":"); message.message = parts.join(":");
m_messages.append(message); m_messages.append(message);
} }
connect(AppLogController::instance(), &AppLogController::messageAdded, this, [=](const QString &category, const QString &message, AppLogController::LogLevel level){ connect(AppLogController::instance(), &AppLogController::messageAdded, this, &LogMessages::append);
beginInsertRows(QModelIndex(), m_messages.count(), m_messages.count());
LogMessage msg;
msg.category = category;
msg.message = message;
msg.level = level;
m_messages.append(msg);
endInsertRows();
});
} }
int LogMessages::rowCount(const QModelIndex &parent) const int LogMessages::rowCount(const QModelIndex &parent) const
@ -310,15 +308,18 @@ int LogMessages::rowCount(const QModelIndex &parent) const
QVariant LogMessages::data(const QModelIndex &index, int role) const QVariant LogMessages::data(const QModelIndex &index, int role) const
{ {
LogMessage message = m_messages.at(index.row());
switch (role) { switch (role) {
case RoleTimestamp:
return message.timestamp;
case RoleCategory: case RoleCategory:
return m_messages.at(index.row()).category; return message.category;
case RoleMessage: case RoleMessage:
return m_messages.at(index.row()).message; return message.message;
case RoleLevel: case RoleLevel:
return m_messages.at(index.row()).level; return message.level;
case RoleText: case RoleText:
return m_messages.at(index.row()).category + ": " + m_messages.at(index.row()).message; return message.timestamp.toString("hh:mm:ss") + ": " + message.category + ": " + message.message;
} }
return QVariant(); return QVariant();
} }
@ -326,6 +327,7 @@ QVariant LogMessages::data(const QModelIndex &index, int role) const
QHash<int, QByteArray> LogMessages::roleNames() const QHash<int, QByteArray> LogMessages::roleNames() const
{ {
QHash<int, QByteArray> roles; QHash<int, QByteArray> roles;
roles.insert(RoleTimestamp, "timestamp");
roles.insert(RoleCategory, "category"); roles.insert(RoleCategory, "category");
roles.insert(RoleMessage, "message"); roles.insert(RoleMessage, "message");
roles.insert(RoleLevel, "level"); roles.insert(RoleLevel, "level");
@ -333,10 +335,11 @@ QHash<int, QByteArray> LogMessages::roleNames() const
return roles; return roles;
} }
void LogMessages::append(const QString &category, const QString &message, AppLogController::LogLevel level) void LogMessages::append(const QDateTime &timestamp, const QString &category, const QString &message, AppLogController::LogLevel level)
{ {
beginInsertRows(QModelIndex(), m_messages.count(), m_messages.count()); beginInsertRows(QModelIndex(), m_messages.count(), m_messages.count());
LogMessage msg; LogMessage msg;
msg.timestamp = timestamp;
msg.category = category; msg.category = category;
msg.message = message; msg.message = message;
msg.level = level; msg.level = level;

View File

@ -36,6 +36,7 @@
#include <QQmlEngine> #include <QQmlEngine>
#include <QAbstractListModel> #include <QAbstractListModel>
#include <QMutex> #include <QMutex>
#include <QDateTime>
class LogMessages; class LogMessages;
class LoggingCategories; class LoggingCategories;
@ -80,7 +81,7 @@ signals:
void logToModelChanged(); void logToModelChanged();
void categoryChanged(const QString &category, LogLevel level); void categoryChanged(const QString &category, LogLevel level);
void messageAdded(const QString &category, const QString &message, LogLevel level); void messageAdded(const QDateTime &timestamp, const QString &category, const QString &message, LogLevel level);
private: private:
explicit AppLogController(QObject *parent = nullptr); explicit AppLogController(QObject *parent = nullptr);
@ -107,6 +108,7 @@ class LogMessages: public QAbstractListModel
public: public:
enum Roles { enum Roles {
RoleTimestamp,
RoleCategory, RoleCategory,
RoleMessage, RoleMessage,
RoleLevel, RoleLevel,
@ -115,6 +117,7 @@ public:
Q_ENUM(Roles) Q_ENUM(Roles)
struct LogMessage { struct LogMessage {
QDateTime timestamp;
QString category; QString category;
QString message; QString message;
AppLogController::LogLevel level; AppLogController::LogLevel level;
@ -126,7 +129,8 @@ public:
QVariant data(const QModelIndex &index, int role) const override; QVariant data(const QModelIndex &index, int role) const override;
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
void append(const QString &category, const QString &message, AppLogController::LogLevel level); private slots:
void append(const QDateTime &timestamp, const QString &category, const QString &message, AppLogController::LogLevel level);
private: private:
QList<LogMessage> m_messages; QList<LogMessage> m_messages;

View File

@ -51,6 +51,7 @@ Page {
ListView { ListView {
id: listView id: listView
anchors.fill: parent anchors.fill: parent
clip: true
ScrollBar.vertical: ScrollBar {} ScrollBar.vertical: ScrollBar {}