swift
filelogger.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "misc/filelogger.h"
5 
6 #include <QCoreApplication>
7 #include <QDateTime>
8 #include <QDir>
9 #include <QFileInfo>
10 #include <QIODevice>
11 #include <QString>
12 #include <QStringBuilder>
13 #include <QtGlobal>
14 
15 #include "config/buildconfig.h"
16 #include "misc/swiftdirectories.h"
17 #include "misc/verify.h"
18 
19 using namespace swift::config;
20 
21 namespace swift::misc
22 {
25  {
27  return applicationName;
28  }
29 
32  {
33  static const QString fileName = applicationName() % QLatin1String("_") %
34  QDateTime::currentDateTimeUtc().toString(QStringLiteral("yyMMddhhmmss")) %
36  QLatin1String(".log");
37  return fileName;
38  }
39 
40  CFileLogger::CFileLogger(QObject *parent) : QObject(parent), m_logFile(this)
41  {
42  Q_ASSERT(!applicationName().isEmpty());
44  removeOldLogFiles();
45  m_logFile.setFileName(getLogFilePath());
46  const bool res = m_logFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text);
47  SWIFT_VERIFY_X(res, Q_FUNC_INFO, "Could not open log file");
48  m_stream.setDevice(&m_logFile);
50  writeHeaderToFile();
51  }
52 
54 
56  {
57  if (m_logFile.isOpen())
58  {
59  disconnect(this); // disconnect from log handler
60  writeContentToFile(QStringLiteral("Logging stops."));
61  m_logFile.close();
62  }
63  }
64 
66 
68  {
69  if (statusMessage.isEmpty()) { return; }
70  if (!m_logFile.isOpen()) { return; }
71  if (!m_logPattern.match(statusMessage)) { return; }
72  const QString categories = statusMessage.getCategoriesAsString();
73  if (categories != m_previousCategories)
74  {
75  writeContentToFile(u"\n[" % categories % u']');
76  m_previousCategories = categories;
77  }
78  const QString finalContent(QDateTime::currentDateTime().toString(QStringLiteral("hh:mm:ss ")) %
79  statusMessage.getSeverityAsString() % u": " % statusMessage.getMessage());
80 
81  writeContentToFile(finalContent);
82  }
83 
85  {
87  return filePath;
88  }
89 
90  void CFileLogger::removeOldLogFiles()
91  {
92  QString nameFilter(applicationName());
93  nameFilter += QLatin1String("*.log");
95 
97  for (const auto &logFileInfo : dir.entryInfoList())
98  {
99  if (logFileInfo.lastModified().daysTo(now) > 7) { dir.remove(logFileInfo.fileName()); }
100  }
101  }
102 
103  void CFileLogger::writeHeaderToFile()
104  {
105  m_stream << "This is " << applicationName();
106  m_stream << " version " << CBuildConfig::getVersionString();
107  m_stream << " running on " << QSysInfo::prettyProductName();
108  m_stream << " " << QSysInfo::currentCpuArchitecture() << Qt::endl;
109 
110  m_stream << "Built from revision " << CBuildConfig::gitHeadSha1();
111  m_stream << " on " << CBuildConfig::buildDateAndTime() << Qt::endl;
112 
113  m_stream << "Built with Qt " << QT_VERSION_STR;
114  m_stream << " and running with Qt " << qVersion();
115  m_stream << " " << QSysInfo::buildAbi() << Qt::endl;
116 
117  m_stream << "Application started." << Qt::endl;
118  }
119 
120  void CFileLogger::writeContentToFile(const QString &content) { m_stream << content << Qt::endl; }
121 } // namespace swift::misc
static QString getLogFileName()
Get the log file name.
Definition: filelogger.cpp:65
void close()
Close file.
Definition: filelogger.cpp:55
~CFileLogger()
Destructor.
Definition: filelogger.cpp:53
void writeStatusMessageToFile(const swift::misc::CStatusMessage &statusMessage)
Write single status message to file.
Definition: filelogger.cpp:67
static QString getLogFilePath()
Get the log file path (including its name)
Definition: filelogger.cpp:84
bool match(const CStatusMessage &message) const
Returns true if the given message matches this pattern.
Definition: logpattern.cpp:177
bool isEmpty() const
Message empty.
Streamable status message, e.g.
QString getCategoriesAsString() const
Message categories as string.
const QString & getSeverityAsString() const
Severity as string.
QString getMessage() const
Message.
static const QString & logDirectory()
Directory for log files.
Free functions in swift::misc.
QString logFileName()
Get log file name.
Definition: filelogger.cpp:31
QString applicationName()
Get application name.
Definition: filelogger.cpp:24
QString applicationFilePath()
qint64 applicationPid()
QDateTime currentDateTime()
QDateTime currentDateTimeUtc()
QString toString(QStringView format) const const
bool mkpath(const QString &dirPath, std::optional< QFileDevice::Permissions > permissions) const const
QDir root()
bool open(FILE *fh, QIODeviceBase::OpenMode mode, QFileDevice::FileHandleFlags handleFlags)
void setFileName(const QString &name)
virtual void close() override
QString completeBaseName() const const
bool isOpen() const const
bool disconnect(const QMetaObject::Connection &connection)
QString number(double n, char format, int precision)
QString buildAbi()
QString currentCpuArchitecture()
QString prettyProductName()
QTextStream & endl(QTextStream &stream)
void setDevice(QIODevice *device)
void setEncoding(QStringConverter::Encoding encoding)
#define SWIFT_VERIFY_X(COND, WHERE, WHAT)
A weaker kind of assert.
Definition: verify.h:26