removed unused logger
This commit is contained in:
parent
195663c6e3
commit
77e51b40b8
6 changed files with 0 additions and 616 deletions
|
|
@ -84,9 +84,6 @@ HEADERS += \
|
|||
utilities.h \
|
||||
vpnconnection.h \
|
||||
protocols/vpnprotocol.h \
|
||||
logger.h \
|
||||
loghandler.h \
|
||||
loglevel.h \
|
||||
constants.h \
|
||||
platforms/ios/QRCodeReaderBase.h
|
||||
|
||||
|
|
@ -144,8 +141,6 @@ SOURCES += \
|
|||
utilities.cpp \
|
||||
vpnconnection.cpp \
|
||||
protocols/vpnprotocol.cpp \
|
||||
logger.cpp \
|
||||
loghandler.cpp \
|
||||
platforms/ios/QRCodeReaderBase.cpp
|
||||
|
||||
RESOURCES += \
|
||||
|
|
|
|||
|
|
@ -1,59 +0,0 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#include "logger.h"
|
||||
#include "loghandler.h"
|
||||
|
||||
Logger::Logger(const QString& module, const QString& className)
|
||||
: Logger(QStringList({module}), className) {}
|
||||
|
||||
Logger::Logger(const QStringList& modules, const QString& className)
|
||||
: m_modules(modules), m_className(className) {}
|
||||
|
||||
Logger::Log Logger::error() { return Log(this, LogLevel::Error); }
|
||||
Logger::Log Logger::warning() { return Log(this, LogLevel::Warning); }
|
||||
Logger::Log Logger::info() { return Log(this, LogLevel::Info); }
|
||||
Logger::Log Logger::debug() { return Log(this, LogLevel::Debug); }
|
||||
|
||||
Logger::Log::Log(Logger* logger, LogLevel logLevel)
|
||||
: m_logger(logger), m_logLevel(logLevel), m_data(new Data()) {}
|
||||
|
||||
Logger::Log::~Log() {
|
||||
LogHandler::messageHandler(m_logLevel, m_logger->modules(),
|
||||
m_logger->className(), m_data->m_buffer.trimmed());
|
||||
delete m_data;
|
||||
}
|
||||
|
||||
#define CREATE_LOG_OP_REF(x) \
|
||||
Logger::Log& Logger::Log::operator<<(x t) { \
|
||||
m_data->m_ts << t << ' '; \
|
||||
return *this; \
|
||||
}
|
||||
|
||||
CREATE_LOG_OP_REF(uint64_t);
|
||||
CREATE_LOG_OP_REF(const char*);
|
||||
CREATE_LOG_OP_REF(const QString&);
|
||||
CREATE_LOG_OP_REF(const QByteArray&);
|
||||
CREATE_LOG_OP_REF(void*);
|
||||
|
||||
#undef CREATE_LOG_OP_REF
|
||||
|
||||
Logger::Log& Logger::Log::operator<<(const QStringList& t) {
|
||||
m_data->m_ts << '[' << t.join(",") << ']' << ' ';
|
||||
return *this;
|
||||
}
|
||||
|
||||
Logger::Log& Logger::Log::operator<<(QTextStreamFunction t) {
|
||||
m_data->m_ts << t;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// static
|
||||
QString Logger::sensitive(const QString& input) {
|
||||
#ifdef QT_DEBUG
|
||||
return input;
|
||||
#else
|
||||
return QString(input.length(), 'X');
|
||||
#endif
|
||||
}
|
||||
|
|
@ -1,90 +0,0 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#ifndef LOGGER_H
|
||||
#define LOGGER_H
|
||||
|
||||
#include "loglevel.h"
|
||||
|
||||
#include <QString>
|
||||
#include <QStringList>
|
||||
#include <QIODevice>
|
||||
#include <QTextStream>
|
||||
|
||||
constexpr const char* LOG_CAPTIVEPORTAL = "captiveportal";
|
||||
constexpr const char* LOG_CONTROLLER = "controller";
|
||||
constexpr const char* LOG_IAP = "iap";
|
||||
constexpr const char* LOG_INSPECTOR = "inspector";
|
||||
constexpr const char* LOG_MAIN = "main";
|
||||
constexpr const char* LOG_MODEL = "model";
|
||||
constexpr const char* LOG_NETWORKING = "networking";
|
||||
constexpr const char* LOG_SERVER = "server";
|
||||
|
||||
#if defined(MVPN_LINUX) || defined(MVPN_ANDROID)
|
||||
constexpr const char* LOG_LINUX = "linux";
|
||||
#endif
|
||||
|
||||
#ifdef MVPN_WINDOWS
|
||||
constexpr const char* LOG_WINDOWS = "windows";
|
||||
#endif
|
||||
|
||||
#if __APPLE__ || defined(MVPN_WASM)
|
||||
constexpr const char* LOG_MACOS = "macos";
|
||||
constexpr const char* LOG_IOS = "ios";
|
||||
#endif
|
||||
|
||||
#if defined(MVPN_ANDROID) || defined(UNIT_TEST)
|
||||
constexpr const char* LOG_ANDROID = "android";
|
||||
#endif
|
||||
|
||||
class Logger {
|
||||
public:
|
||||
Logger(const QString& module, const QString& className);
|
||||
Logger(const QStringList& modules, const QString& className);
|
||||
|
||||
const QStringList& modules() const { return m_modules; }
|
||||
const QString& className() const { return m_className; }
|
||||
|
||||
class Log {
|
||||
public:
|
||||
Log(Logger* logger, LogLevel level);
|
||||
~Log();
|
||||
|
||||
Log& operator<<(uint64_t t);
|
||||
Log& operator<<(const char* t);
|
||||
Log& operator<<(const QString& t);
|
||||
Log& operator<<(const QStringList& t);
|
||||
Log& operator<<(const QByteArray& t);
|
||||
Log& operator<<(QTextStreamFunction t);
|
||||
Log& operator<<(void* t);
|
||||
|
||||
private:
|
||||
Logger* m_logger;
|
||||
LogLevel m_logLevel;
|
||||
|
||||
struct Data {
|
||||
Data() : m_ts(&m_buffer, QIODevice::WriteOnly) {}
|
||||
|
||||
QString m_buffer;
|
||||
QTextStream m_ts;
|
||||
};
|
||||
|
||||
Data* m_data;
|
||||
};
|
||||
|
||||
Log error();
|
||||
Log warning();
|
||||
Log info();
|
||||
Log debug();
|
||||
|
||||
// Use this to log sensitive data such as IP address, session tokens, and so
|
||||
// on.
|
||||
QString sensitive(const QString& input);
|
||||
|
||||
private:
|
||||
QStringList m_modules;
|
||||
QString m_className;
|
||||
};
|
||||
|
||||
#endif // LOGGER_H
|
||||
|
|
@ -1,345 +0,0 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#include "loghandler.h"
|
||||
#include "constants.h"
|
||||
#include "logger.h"
|
||||
|
||||
#include <QDate>
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
#include <QFileInfo>
|
||||
#include <QMessageLogContext>
|
||||
#include <QProcessEnvironment>
|
||||
#include <QStandardPaths>
|
||||
#include <QString>
|
||||
#include <QTextStream>
|
||||
|
||||
#ifdef MVPN_ANDROID
|
||||
# include <android/log.h>
|
||||
#endif
|
||||
|
||||
constexpr qint64 LOG_MAX_FILE_SIZE = 204800;
|
||||
constexpr const char* LOG_FILENAME = "mozillavpn.txt";
|
||||
|
||||
namespace {
|
||||
QMutex s_mutex;
|
||||
QString s_location =
|
||||
QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
|
||||
LogHandler* s_instance = nullptr;
|
||||
|
||||
LogLevel qtTypeToLogLevel(QtMsgType type) {
|
||||
switch (type) {
|
||||
case QtDebugMsg:
|
||||
return Debug;
|
||||
case QtInfoMsg:
|
||||
return Info;
|
||||
case QtWarningMsg:
|
||||
return Warning;
|
||||
case QtCriticalMsg:
|
||||
[[fallthrough]];
|
||||
case QtFatalMsg:
|
||||
return Error;
|
||||
default:
|
||||
return Debug;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
// static
|
||||
LogHandler* LogHandler::instance() {
|
||||
QMutexLocker lock(&s_mutex);
|
||||
return maybeCreate(lock);
|
||||
}
|
||||
|
||||
// static
|
||||
void LogHandler::messageQTHandler(QtMsgType type,
|
||||
const QMessageLogContext& context,
|
||||
const QString& message) {
|
||||
QMutexLocker lock(&s_mutex);
|
||||
maybeCreate(lock)->addLog(Log(qtTypeToLogLevel(type), context.file,
|
||||
context.function, context.line, message),
|
||||
lock);
|
||||
}
|
||||
|
||||
// static
|
||||
void LogHandler::messageHandler(LogLevel logLevel, const QStringList& modules,
|
||||
const QString& className,
|
||||
const QString& message) {
|
||||
QMutexLocker lock(&s_mutex);
|
||||
maybeCreate(lock)->addLog(Log(logLevel, modules, className, message), lock);
|
||||
}
|
||||
|
||||
// static
|
||||
LogHandler* LogHandler::maybeCreate(const QMutexLocker<QMutex>& proofOfLock) {
|
||||
if (!s_instance) {
|
||||
LogLevel minLogLevel = Debug; // TODO: in prod, we should log >= warning
|
||||
QStringList modules;
|
||||
QProcessEnvironment pe = QProcessEnvironment::systemEnvironment();
|
||||
if (pe.contains("MOZVPN_LEVEL")) {
|
||||
QString level = pe.value("MOZVPN_LEVEL");
|
||||
if (level == "info")
|
||||
minLogLevel = Info;
|
||||
else if (level == "warning")
|
||||
minLogLevel = Warning;
|
||||
else if (level == "error")
|
||||
minLogLevel = Error;
|
||||
}
|
||||
|
||||
if (pe.contains("MOZVPN_LOG")) {
|
||||
QStringList parts = pe.value("MOZVPN_LOG").split(",");
|
||||
for (const QString& part : parts) {
|
||||
modules.append(part.trimmed());
|
||||
}
|
||||
}
|
||||
|
||||
s_instance = new LogHandler(minLogLevel, modules, proofOfLock);
|
||||
}
|
||||
|
||||
return s_instance;
|
||||
}
|
||||
|
||||
// static
|
||||
void LogHandler::prettyOutput(QTextStream& out, const LogHandler::Log& log) {
|
||||
out << "[" << log.m_dateTime.toString("dd.MM.yyyy hh:mm:ss.zzz") << "] ";
|
||||
|
||||
switch (log.m_logLevel) {
|
||||
case Debug:
|
||||
out << "Debug: ";
|
||||
break;
|
||||
case Info:
|
||||
out << "Info: ";
|
||||
break;
|
||||
case Warning:
|
||||
out << "Warning: ";
|
||||
break;
|
||||
case Error:
|
||||
out << "Error: ";
|
||||
break;
|
||||
default:
|
||||
out << "?!?: ";
|
||||
break;
|
||||
}
|
||||
|
||||
if (log.m_fromQT) {
|
||||
out << log.m_message;
|
||||
|
||||
if (!log.m_file.isEmpty() || !log.m_function.isEmpty()) {
|
||||
out << " (";
|
||||
|
||||
if (!log.m_file.isEmpty()) {
|
||||
int pos = log.m_file.lastIndexOf("/");
|
||||
out << log.m_file.right(log.m_file.length() - pos - 1);
|
||||
|
||||
if (log.m_line >= 0) {
|
||||
out << ":" << log.m_line;
|
||||
}
|
||||
|
||||
if (!log.m_function.isEmpty()) {
|
||||
out << ", ";
|
||||
}
|
||||
}
|
||||
|
||||
if (!log.m_function.isEmpty()) {
|
||||
out << log.m_function;
|
||||
}
|
||||
|
||||
out << ")";
|
||||
}
|
||||
} else {
|
||||
out << "(" << log.m_modules.join("|") << " - " << log.m_className << ") "
|
||||
<< log.m_message;
|
||||
}
|
||||
|
||||
out << Qt::endl;
|
||||
}
|
||||
|
||||
// static
|
||||
void LogHandler::enableDebug() {
|
||||
QMutexLocker lock(&s_mutex);
|
||||
maybeCreate(lock)->m_showDebug = true;
|
||||
}
|
||||
|
||||
LogHandler::LogHandler(LogLevel minLogLevel, const QStringList& modules,
|
||||
const QMutexLocker<QMutex>& proofOfLock)
|
||||
: m_minLogLevel(minLogLevel), m_modules(modules) {
|
||||
Q_UNUSED(proofOfLock);
|
||||
|
||||
#if defined(QT_DEBUG) || defined(MVPN_WASM)
|
||||
m_showDebug = true;
|
||||
#endif
|
||||
|
||||
if (!s_location.isEmpty()) {
|
||||
openLogFile(proofOfLock);
|
||||
}
|
||||
}
|
||||
|
||||
void LogHandler::addLog(const Log& log, const QMutexLocker<QMutex>& proofOfLock) {
|
||||
if (!matchLogLevel(log, proofOfLock)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!matchModule(log, proofOfLock)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_output) {
|
||||
prettyOutput(*m_output, log);
|
||||
}
|
||||
|
||||
if ((log.m_logLevel != LogLevel::Debug) || m_showDebug) {
|
||||
QTextStream out(stderr);
|
||||
prettyOutput(out, log);
|
||||
}
|
||||
|
||||
QByteArray buffer;
|
||||
{
|
||||
QTextStream out(&buffer);
|
||||
prettyOutput(out, log);
|
||||
}
|
||||
|
||||
emit logEntryAdded(buffer);
|
||||
|
||||
#if defined(MVPN_ANDROID) && defined(QT_DEBUG)
|
||||
const char* str = buffer.constData();
|
||||
if (str) {
|
||||
__android_log_write(ANDROID_LOG_DEBUG, "mozillavpn", str);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
bool LogHandler::matchModule(const Log& log,
|
||||
const QMutexLocker<QMutex>& proofOfLock) const {
|
||||
Q_UNUSED(proofOfLock);
|
||||
|
||||
// Let's include QT logs always.
|
||||
if (log.m_fromQT) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// If no modules has been specified, let's include all.
|
||||
if (m_modules.isEmpty()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (const QString& module : log.m_modules) {
|
||||
if (m_modules.contains(module)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool LogHandler::matchLogLevel(const Log& log,
|
||||
const QMutexLocker<QMutex>& proofOfLock) const {
|
||||
Q_UNUSED(proofOfLock);
|
||||
return log.m_logLevel >= m_minLogLevel;
|
||||
}
|
||||
|
||||
// static
|
||||
void LogHandler::writeLogs(QTextStream& out) {
|
||||
QMutexLocker lock(&s_mutex);
|
||||
|
||||
if (!s_instance || !s_instance->m_logFile) {
|
||||
return;
|
||||
}
|
||||
|
||||
QString logFileName = s_instance->m_logFile->fileName();
|
||||
s_instance->closeLogFile(lock);
|
||||
|
||||
{
|
||||
QFile file(logFileName);
|
||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||
return;
|
||||
}
|
||||
|
||||
out << file.readAll();
|
||||
}
|
||||
|
||||
s_instance->openLogFile(lock);
|
||||
}
|
||||
|
||||
// static
|
||||
void LogHandler::cleanupLogs() {
|
||||
QMutexLocker lock(&s_mutex);
|
||||
cleanupLogFile(lock);
|
||||
}
|
||||
|
||||
// static
|
||||
void LogHandler::cleanupLogFile(const QMutexLocker<QMutex>& proofOfLock) {
|
||||
if (!s_instance || !s_instance->m_logFile) {
|
||||
return;
|
||||
}
|
||||
|
||||
QString logFileName = s_instance->m_logFile->fileName();
|
||||
s_instance->closeLogFile(proofOfLock);
|
||||
|
||||
{
|
||||
QFile file(logFileName);
|
||||
file.remove();
|
||||
}
|
||||
|
||||
s_instance->openLogFile(proofOfLock);
|
||||
}
|
||||
|
||||
// static
|
||||
void LogHandler::setLocation(const QString& path) {
|
||||
QMutexLocker lock(&s_mutex);
|
||||
s_location = path;
|
||||
|
||||
if (s_instance && s_instance->m_logFile) {
|
||||
cleanupLogFile(lock);
|
||||
}
|
||||
}
|
||||
|
||||
void LogHandler::openLogFile(const QMutexLocker<QMutex>& proofOfLock) {
|
||||
Q_UNUSED(proofOfLock);
|
||||
Q_ASSERT(!m_logFile);
|
||||
Q_ASSERT(!m_output);
|
||||
|
||||
QDir appDataLocation(s_location);
|
||||
if (!appDataLocation.exists()) {
|
||||
QDir tmp(s_location);
|
||||
tmp.cdUp();
|
||||
if (!tmp.exists()) {
|
||||
return;
|
||||
}
|
||||
if (!tmp.mkdir(appDataLocation.dirName())) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
QString logFileName = appDataLocation.filePath(LOG_FILENAME);
|
||||
m_logFile = new QFile(logFileName);
|
||||
if (m_logFile->size() > LOG_MAX_FILE_SIZE) {
|
||||
m_logFile->remove();
|
||||
}
|
||||
|
||||
if (!m_logFile->open(QIODevice::WriteOnly | QIODevice::Append |
|
||||
QIODevice::Text)) {
|
||||
delete m_logFile;
|
||||
m_logFile = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
m_output = new QTextStream(m_logFile);
|
||||
|
||||
addLog(Log(Debug, QStringList{LOG_MAIN}, "LogHandler",
|
||||
QString("Log file: %1").arg(logFileName)),
|
||||
proofOfLock);
|
||||
}
|
||||
|
||||
void LogHandler::closeLogFile(const QMutexLocker<QMutex>& proofOfLock) {
|
||||
Q_UNUSED(proofOfLock);
|
||||
|
||||
if (m_logFile) {
|
||||
delete m_output;
|
||||
m_output = nullptr;
|
||||
|
||||
delete m_logFile;
|
||||
m_logFile = nullptr;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,102 +0,0 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#ifndef LOGHANDLER_H
|
||||
#define LOGHANDLER_H
|
||||
|
||||
#include "loglevel.h"
|
||||
|
||||
#include <QDateTime>
|
||||
#include <QObject>
|
||||
#include <QVector>
|
||||
#include <QMutexLocker>
|
||||
|
||||
class QFile;
|
||||
class QTextStream;
|
||||
|
||||
class LogHandler final : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
struct Log {
|
||||
Log() = default;
|
||||
|
||||
Log(LogLevel logLevel, const QStringList& modules, const QString& className,
|
||||
const QString& message)
|
||||
: m_logLevel(logLevel),
|
||||
m_dateTime(QDateTime::currentDateTime()),
|
||||
m_modules(modules),
|
||||
m_className(className),
|
||||
m_message(message),
|
||||
m_fromQT(false) {}
|
||||
|
||||
Log(LogLevel logLevel, const QString& file, const QString& function,
|
||||
uint32_t line, const QString& message)
|
||||
: m_logLevel(logLevel),
|
||||
m_dateTime(QDateTime::currentDateTime()),
|
||||
m_file(file),
|
||||
m_function(function),
|
||||
m_message(message),
|
||||
m_line(line),
|
||||
m_fromQT(true) {}
|
||||
|
||||
LogLevel m_logLevel = LogLevel::Debug;
|
||||
QDateTime m_dateTime;
|
||||
QString m_file;
|
||||
QString m_function;
|
||||
QStringList m_modules;
|
||||
QString m_className;
|
||||
QString m_message;
|
||||
int32_t m_line = -1;
|
||||
bool m_fromQT = false;
|
||||
};
|
||||
|
||||
static LogHandler* instance();
|
||||
|
||||
static void messageQTHandler(QtMsgType type,
|
||||
const QMessageLogContext& context,
|
||||
const QString& message);
|
||||
|
||||
static void messageHandler(LogLevel logLevel, const QStringList& modules,
|
||||
const QString& className, const QString& message);
|
||||
|
||||
static void prettyOutput(QTextStream& out, const LogHandler::Log& log);
|
||||
|
||||
static void writeLogs(QTextStream& out);
|
||||
|
||||
static void cleanupLogs();
|
||||
|
||||
static void setLocation(const QString& path);
|
||||
|
||||
static void enableDebug();
|
||||
|
||||
signals:
|
||||
void logEntryAdded(const QByteArray& log);
|
||||
|
||||
private:
|
||||
LogHandler(LogLevel m_minLogLevel, const QStringList& modules,
|
||||
const QMutexLocker<QMutex>& proofOfLock);
|
||||
|
||||
static LogHandler* maybeCreate(const QMutexLocker<QMutex>& proofOfLock);
|
||||
|
||||
void addLog(const Log& log, const QMutexLocker<QMutex>& proofOfLock);
|
||||
|
||||
bool matchLogLevel(const Log& log, const QMutexLocker<QMutex>& proofOfLock) const;
|
||||
bool matchModule(const Log& log, const QMutexLocker<QMutex>& proofOfLock) const;
|
||||
|
||||
void openLogFile(const QMutexLocker<QMutex>& proofOfLock);
|
||||
|
||||
void closeLogFile(const QMutexLocker<QMutex>& proofOfLock);
|
||||
|
||||
static void cleanupLogFile(const QMutexLocker<QMutex>& proofOfLock);
|
||||
|
||||
const LogLevel m_minLogLevel;
|
||||
const QStringList m_modules;
|
||||
bool m_showDebug = false;
|
||||
|
||||
QFile* m_logFile = nullptr;
|
||||
QTextStream* m_output = nullptr;
|
||||
};
|
||||
|
||||
#endif // LOGHANDLER_H
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#ifndef LOGLEVEL_H
|
||||
#define LOGLEVEL_H
|
||||
|
||||
enum LogLevel {
|
||||
Debug,
|
||||
Info,
|
||||
Warning,
|
||||
Error,
|
||||
};
|
||||
|
||||
#endif // LOGLEVEL_H
|
||||
Loading…
Add table
Add a link
Reference in a new issue