qBittorrent
FileLogger Class Reference

#include <filelogger.h>

Inheritance diagram for FileLogger:
Collaboration diagram for FileLogger:

Public Types

enum  FileLogAgeType { DAYS , MONTHS , YEARS }
 

Public Member Functions

 FileLogger (const QString &path, bool backup, int maxSize, bool deleteOld, int age, FileLogAgeType ageType)
 
 ~FileLogger ()
 
void changePath (const QString &newPath)
 
void deleteOld (int age, FileLogAgeType ageType)
 
void setBackup (bool value)
 
void setMaxSize (int value)
 

Private Slots

void addLogMessage (const Log::Msg &msg)
 
void flushLog ()
 

Private Member Functions

void openLogFile ()
 
void closeLogFile ()
 

Private Attributes

QString m_path
 
bool m_backup
 
int m_maxSize
 
QFile m_logFile
 
QTimer m_flusher
 

Detailed Description

Definition at line 40 of file filelogger.h.

Member Enumeration Documentation

◆ FileLogAgeType

Enumerator
DAYS 
MONTHS 
YEARS 

Definition at line 46 of file filelogger.h.

47  {
48  DAYS,
49  MONTHS,
50  YEARS
51  };

Constructor & Destructor Documentation

◆ FileLogger()

FileLogger::FileLogger ( const QString &  path,
bool  backup,
int  maxSize,
bool  deleteOld,
int  age,
FileLogAgeType  ageType 
)

Definition at line 47 of file filelogger.cpp.

48  : m_backup(backup)
49  , m_maxSize(maxSize)
50 {
51  m_flusher.setInterval(FLUSH_INTERVAL);
52  m_flusher.setSingleShot(true);
53  connect(&m_flusher, &QTimer::timeout, this, &FileLogger::flushLog);
54 
55  changePath(path);
56  if (deleteOld)
57  this->deleteOld(age, ageType);
58 
59  const Logger *const logger = Logger::instance();
60  for (const Log::Msg &msg : asConst(logger->getMessages()))
61  addLogMessage(msg);
62 
63  connect(logger, &Logger::newLogMessage, this, &FileLogger::addLogMessage);
64 }
void flushLog()
Definition: filelogger.cpp:172
QTimer m_flusher
Definition: filelogger.h:73
void addLogMessage(const Log::Msg &msg)
Definition: filelogger.cpp:124
int m_maxSize
Definition: filelogger.h:71
void changePath(const QString &newPath)
Definition: filelogger.cpp:71
bool m_backup
Definition: filelogger.h:70
void deleteOld(int age, FileLogAgeType ageType)
Definition: filelogger.cpp:87
Definition: logger.h:73
void newLogMessage(const Log::Msg &message)
QVector< Log::Msg > getMessages(int lastKnownId=-1) const
Definition: logger.cpp:93
static Logger * instance()
Definition: logger.cpp:56
constexpr std::add_const_t< T > & asConst(T &t) noexcept
Definition: global.h:42
const std::chrono::seconds FLUSH_INTERVAL
Definition: filelogger.cpp:44

References addLogMessage(), asConst(), changePath(), deleteOld(), anonymous_namespace{filelogger.cpp}::FLUSH_INTERVAL, flushLog(), Logger::getMessages(), Logger::instance(), m_flusher, and Logger::newLogMessage().

Here is the call graph for this function:

◆ ~FileLogger()

FileLogger::~FileLogger ( )

Definition at line 66 of file filelogger.cpp.

67 {
68  closeLogFile();
69 }
void closeLogFile()
Definition: filelogger.cpp:188

References closeLogFile().

Here is the call graph for this function:

Member Function Documentation

◆ addLogMessage

void FileLogger::addLogMessage ( const Log::Msg msg)
privateslot

Definition at line 124 of file filelogger.cpp.

125 {
126  if (!m_logFile.isOpen()) return;
127 
128  QTextStream stream(&m_logFile);
129 #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
130  stream.setCodec("UTF-8");
131 #endif
132 
133  switch (msg.type)
134  {
135  case Log::INFO:
136  stream << "(I) ";
137  break;
138  case Log::WARNING:
139  stream << "(W) ";
140  break;
141  case Log::CRITICAL:
142  stream << "(C) ";
143  break;
144  default:
145  stream << "(N) ";
146  }
147 
148  stream << QDateTime::fromMSecsSinceEpoch(msg.timestamp).toString(Qt::ISODate) << " - " << msg.message << '\n';
149 
150  if (m_backup && (m_logFile.size() >= m_maxSize))
151  {
152  closeLogFile();
153  int counter = 0;
154  QString backupLogFilename = m_path + ".bak";
155 
156  while (QFile::exists(backupLogFilename))
157  {
158  ++counter;
159  backupLogFilename = m_path + ".bak" + QString::number(counter);
160  }
161 
162  QFile::rename(m_path, backupLogFilename);
163  openLogFile();
164  }
165  else
166  {
167  if (!m_flusher.isActive())
168  m_flusher.start();
169  }
170 }
QFile m_logFile
Definition: filelogger.h:72
QString m_path
Definition: filelogger.h:69
void openLogFile()
Definition: filelogger.cpp:178
@ WARNING
Definition: logger.h:47
@ CRITICAL
Definition: logger.h:48
@ INFO
Definition: logger.h:46
QString message
Definition: logger.h:57
MsgType type
Definition: logger.h:55
qint64 timestamp
Definition: logger.h:56

References closeLogFile(), Log::CRITICAL, Log::INFO, m_backup, m_flusher, m_logFile, m_maxSize, m_path, Log::Msg::message, openLogFile(), Log::Msg::timestamp, Log::Msg::type, and Log::WARNING.

Referenced by FileLogger().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ changePath()

void FileLogger::changePath ( const QString &  newPath)

Definition at line 71 of file filelogger.cpp.

72 {
73  const QDir dir(newPath);
74  dir.mkpath(newPath);
75  const QString tmpPath = dir.absoluteFilePath("qbittorrent.log");
76 
77  if (tmpPath != m_path)
78  {
79  m_path = tmpPath;
80 
81  closeLogFile();
82  m_logFile.setFileName(m_path);
83  openLogFile();
84  }
85 }

References closeLogFile(), m_logFile, m_path, and openLogFile().

Referenced by FileLogger().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ closeLogFile()

void FileLogger::closeLogFile ( )
private

Definition at line 188 of file filelogger.cpp.

189 {
190  m_flusher.stop();
191  m_logFile.close();
192 }

References m_flusher, and m_logFile.

Referenced by addLogMessage(), changePath(), and ~FileLogger().

Here is the caller graph for this function:

◆ deleteOld()

void FileLogger::deleteOld ( int  age,
FileLogAgeType  ageType 
)

Definition at line 87 of file filelogger.cpp.

88 {
89  const QDateTime date = QDateTime::currentDateTime();
90  const QDir dir(Utils::Fs::branchPath(m_path));
91  const QFileInfoList fileList = dir.entryInfoList(QStringList("qbittorrent.log.bak*")
92  , (QDir::Files | QDir::Writable), (QDir::Time | QDir::Reversed));
93 
94  for (const QFileInfo &file : fileList)
95  {
96  QDateTime modificationDate = file.lastModified();
97  switch (ageType)
98  {
99  case DAYS:
100  modificationDate = modificationDate.addDays(age);
101  break;
102  case MONTHS:
103  modificationDate = modificationDate.addMonths(age);
104  break;
105  default:
106  modificationDate = modificationDate.addYears(age);
107  }
108  if (modificationDate > date)
109  break;
110  Utils::Fs::forceRemove(file.absoluteFilePath());
111  }
112 }
QString branchPath(const QString &filePath, QString *removed=nullptr)
Definition: fs.cpp:276
bool forceRemove(const QString &filePath)
Definition: fs.cpp:173
file(GLOB QBT_TS_FILES "${qBittorrent_SOURCE_DIR}/src/lang/*.ts") set_source_files_properties($
Definition: CMakeLists.txt:5

References Utils::Fs::branchPath(), DAYS, file(), Utils::Fs::forceRemove(), m_path, and MONTHS.

Referenced by FileLogger().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ flushLog

void FileLogger::flushLog ( )
privateslot

Definition at line 172 of file filelogger.cpp.

173 {
174  if (m_logFile.isOpen())
175  m_logFile.flush();
176 }

References m_logFile.

Referenced by FileLogger().

Here is the caller graph for this function:

◆ openLogFile()

void FileLogger::openLogFile ( )
private

Definition at line 178 of file filelogger.cpp.

179 {
180  if (!m_logFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)
181  || !m_logFile.setPermissions(QFile::ReadOwner | QFile::WriteOwner))
182  {
183  m_logFile.close();
184  LogMsg(tr("An error occurred while trying to open the log file. Logging to file is disabled."), Log::CRITICAL);
185  }
186 }
void LogMsg(const QString &message, const Log::MsgType &type)
Definition: logger.cpp:125

References Log::CRITICAL, LogMsg(), and m_logFile.

Referenced by addLogMessage(), and changePath().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ setBackup()

void FileLogger::setBackup ( bool  value)

Definition at line 114 of file filelogger.cpp.

115 {
116  m_backup = value;
117 }
T value(const QString &key, const T &defaultValue={})
Definition: preferences.cpp:64

References m_backup, and anonymous_namespace{preferences.cpp}::value().

Here is the call graph for this function:

◆ setMaxSize()

void FileLogger::setMaxSize ( int  value)

Definition at line 119 of file filelogger.cpp.

120 {
121  m_maxSize = value;
122 }

References m_maxSize, and anonymous_namespace{preferences.cpp}::value().

Here is the call graph for this function:

Member Data Documentation

◆ m_backup

bool FileLogger::m_backup
private

Definition at line 70 of file filelogger.h.

Referenced by addLogMessage(), and setBackup().

◆ m_flusher

QTimer FileLogger::m_flusher
private

Definition at line 73 of file filelogger.h.

Referenced by addLogMessage(), closeLogFile(), and FileLogger().

◆ m_logFile

QFile FileLogger::m_logFile
private

Definition at line 72 of file filelogger.h.

Referenced by addLogMessage(), changePath(), closeLogFile(), flushLog(), and openLogFile().

◆ m_maxSize

int FileLogger::m_maxSize
private

Definition at line 71 of file filelogger.h.

Referenced by addLogMessage(), and setMaxSize().

◆ m_path

QString FileLogger::m_path
private

Definition at line 69 of file filelogger.h.

Referenced by addLogMessage(), changePath(), and deleteOld().


The documentation for this class was generated from the following files: