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 
18 using namespace swift::config;
19 
20 namespace swift::misc
21 {
23  QString applicationName()
24  {
25  static const QString applicationName = QFileInfo(QCoreApplication::applicationFilePath()).completeBaseName();
26  return applicationName;
27  }
28 
30  QString logFileName()
31  {
32  static const QString fileName = applicationName() % QLatin1String("_") %
33  QDateTime::currentDateTimeUtc().toString(QStringLiteral("yyMMddhhmmss")) %
34  QLatin1String("_") % QString::number(QCoreApplication::applicationPid()) %
35  QLatin1String(".log");
36  return fileName;
37  }
38 
39  CFileLogger::CFileLogger(QObject *parent) : QObject(parent), m_logFile(this)
40  {
41  Q_ASSERT(!applicationName().isEmpty());
42  QDir::root().mkpath(CSwiftDirectories::logDirectory());
43  removeOldLogFiles();
44  m_logFile.setFileName(getLogFilePath());
45  m_logFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text);
46  m_stream.setDevice(&m_logFile);
47  m_stream.setEncoding(QStringConverter::Utf8);
48  writeHeaderToFile();
49  }
50 
52 
54  {
55  if (m_logFile.isOpen())
56  {
57  disconnect(this); // disconnect from log handler
58  writeContentToFile(QStringLiteral("Logging stops."));
59  m_logFile.close();
60  }
61  }
62 
63  QString CFileLogger::getLogFileName() { return logFileName(); }
64 
66  {
67  if (statusMessage.isEmpty()) { return; }
68  if (!m_logFile.isOpen()) { return; }
69  if (!m_logPattern.match(statusMessage)) { return; }
70  const QString categories = statusMessage.getCategoriesAsString();
71  if (categories != m_previousCategories)
72  {
73  writeContentToFile(u"\n[" % categories % u']');
74  m_previousCategories = categories;
75  }
76  const QString finalContent(QDateTime::currentDateTime().toString(QStringLiteral("hh:mm:ss ")) %
77  statusMessage.getSeverityAsString() % u": " % statusMessage.getMessage());
78 
79  writeContentToFile(finalContent);
80  }
81 
83  {
84  QString filePath = CSwiftDirectories::logDirectory() % '/' % logFileName();
85  return filePath;
86  }
87 
88  void CFileLogger::removeOldLogFiles()
89  {
90  QString nameFilter(applicationName());
91  nameFilter += QLatin1String("*.log");
92  QDir dir(CSwiftDirectories::logDirectory(), nameFilter, QDir::Name, QDir::Files);
93 
94  QDateTime now = QDateTime::currentDateTime();
95  for (const auto &logFileInfo : dir.entryInfoList())
96  {
97  if (logFileInfo.lastModified().daysTo(now) > 7) { dir.remove(logFileInfo.fileName()); }
98  }
99  }
100 
101  void CFileLogger::writeHeaderToFile()
102  {
103  m_stream << "This is " << applicationName();
104  m_stream << " version " << CBuildConfig::getVersionString();
105  m_stream << " running on " << QSysInfo::prettyProductName();
106  m_stream << " " << QSysInfo::currentCpuArchitecture() << Qt::endl;
107 
108  m_stream << "Built from revision " << CBuildConfig::gitHeadSha1();
109  m_stream << " on " << CBuildConfig::buildDateAndTime() << Qt::endl;
110 
111  m_stream << "Built with Qt " << QT_VERSION_STR;
112  m_stream << " and running with Qt " << qVersion();
113  m_stream << " " << QSysInfo::buildAbi() << Qt::endl;
114 
115  m_stream << "Application started." << Qt::endl;
116  }
117 
118  void CFileLogger::writeContentToFile(const QString &content) { m_stream << content << Qt::endl; }
119 } // namespace swift::misc
static QString getLogFileName()
Get the log file name.
Definition: filelogger.cpp:63
void close()
Close file.
Definition: filelogger.cpp:53
~CFileLogger()
Destructor.
Definition: filelogger.cpp:51
void writeStatusMessageToFile(const swift::misc::CStatusMessage &statusMessage)
Write single status message to file.
Definition: filelogger.cpp:65
static QString getLogFilePath()
Get the log file path (including its name)
Definition: filelogger.cpp:82
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:30
QString applicationName()
Get application name.
Definition: filelogger.cpp:23