core/log: create fully detailed logs by default

The .qslog logs now log messages for quickshell* by default.
This commit is contained in:
outfoxxed 2024-08-09 20:24:00 -07:00
parent 291179ede2
commit 0fc98652a8
Signed by: outfoxxed
GPG key ID: 4C88A185FB89301E
4 changed files with 85 additions and 13 deletions

View file

@ -5,6 +5,7 @@
#include <qbytearrayview.h>
#include <qdatetime.h>
#include <qendian.h>
#include <qhash.h>
#include <qhashfunctions.h>
#include <qlogging.h>
#include <qloggingcategory.h>
@ -92,10 +93,48 @@ void LogManager::messageHandler(
auto* self = LogManager::instance();
LogMessage::formatMessage(self->stdoutStream, message, self->colorLogs, false);
self->stdoutStream << Qt::endl;
auto display = true;
emit self->logMessage(message);
const auto* key = static_cast<const void*>(context.category);
if (self->sparseFilters.contains(key)) {
auto filter = self->sparseFilters.value(key);
switch (type) {
case QtDebugMsg: display = filter.debug; break;
case QtInfoMsg: display = filter.info; break;
case QtWarningMsg: display = filter.warn; break;
case QtCriticalMsg: display = filter.critical; break;
default: break;
}
}
if (display) {
LogMessage::formatMessage(self->stdoutStream, message, self->colorLogs, false);
self->stdoutStream << Qt::endl;
}
emit self->logMessage(message, display);
}
void LogManager::filterCategory(QLoggingCategory* category) {
auto* instance = LogManager::instance();
if (instance->lastCategoryFilter) {
instance->lastCategoryFilter(category);
}
if (QLatin1StringView(category->categoryName()).startsWith(QLatin1StringView("quickshell"))) {
// We assume the category name pointer will always be the same and be comparable in the message handler.
LogManager::instance()->sparseFilters.insert(
static_cast<const void*>(category->categoryName()),
CategoryFilter(category)
);
category->setEnabled(QtDebugMsg, true);
category->setEnabled(QtInfoMsg, true);
category->setEnabled(QtWarningMsg, true);
category->setEnabled(QtCriticalMsg, true);
}
}
LogManager* LogManager::instance() {
@ -103,12 +142,16 @@ LogManager* LogManager::instance() {
return instance;
}
void LogManager::init(bool color) {
void LogManager::init(bool color, bool sparseOnly) {
auto* instance = LogManager::instance();
instance->colorLogs = color;
qInstallMessageHandler(&LogManager::messageHandler);
if (!sparseOnly) {
instance->lastCategoryFilter = QLoggingCategory::installFilter(&LogManager::filterCategory);
}
qCDebug(logLogging) << "Creating offthread logger...";
auto* thread = new QThread();
instance->threadProxy.moveToThread(thread);
@ -269,10 +312,12 @@ void ThreadLogging::initFs() {
qCDebug(logLogging) << "Switched threaded logger to queued eventloop connection.";
}
void ThreadLogging::onMessage(const LogMessage& msg) {
if (this->fileStream.device() == nullptr) return;
LogMessage::formatMessage(this->fileStream, msg, false, true);
this->fileStream << Qt::endl;
void ThreadLogging::onMessage(const LogMessage& msg, bool showInSparse) {
if (showInSparse) {
if (this->fileStream.device() == nullptr) return;
LogMessage::formatMessage(this->fileStream, msg, false, true);
this->fileStream << Qt::endl;
}
if (this->detailedWriter.write(msg)) {
this->detailedFile->flush();

View file

@ -7,6 +7,7 @@
#include <qhash.h>
#include <qlatin1stringview.h>
#include <qlogging.h>
#include <qloggingcategory.h>
#include <qobject.h>
#include <qtmetamacros.h>
@ -54,23 +55,42 @@ private:
ThreadLogging* logging = nullptr;
};
struct CategoryFilter {
explicit CategoryFilter() = default;
explicit CategoryFilter(QLoggingCategory* category)
: debug(category->isDebugEnabled())
, info(category->isInfoEnabled())
, warn(category->isWarningEnabled())
, critical(category->isCriticalEnabled()) {}
bool debug = true;
bool info = true;
bool warn = true;
bool critical = true;
};
class LogManager: public QObject {
Q_OBJECT;
public:
static void init(bool color);
static void init(bool color, bool sparseOnly);
static void initFs();
static LogManager* instance();
bool colorLogs = true;
signals:
void logMessage(LogMessage msg);
void logMessage(LogMessage msg, bool showInSparse);
private:
explicit LogManager();
static void messageHandler(QtMsgType type, const QMessageLogContext& context, const QString& msg);
static void filterCategory(QLoggingCategory* category);
QLoggingCategory::CategoryFilter lastCategoryFilter = nullptr;
QHash<const void*, CategoryFilter> sparseFilters;
QTextStream stdoutStream;
LoggingThreadProxy threadProxy;
};

View file

@ -111,7 +111,7 @@ public:
void setupFileLogging();
private slots:
void onMessage(const LogMessage& msg);
void onMessage(const LogMessage& msg, bool showInSparse);
private:
QFile* file = nullptr;

View file

@ -2,8 +2,8 @@
#include <iostream>
#include <string>
#include <CLI/CLI.hpp> // NOLINT: Need to include this for impls of some CLI11 classes
#include <CLI/App.hpp>
#include <CLI/CLI.hpp> // NOLINT: Need to include this for impls of some CLI11 classes
#include <CLI/Validators.hpp>
#include <qapplication.h>
#include <qcoreapplication.h>
@ -129,9 +129,16 @@ int qs_main(int argc, char** argv) {
->needs(debugPortArg);
/// ---
bool sparseLogsOnly = false;
app.add_flag("--info", printInfo, "Print information about the shell")->excludes(debugPortArg);
app.add_flag("--no-color", noColor, "Do not color the log output. (Env:NO_COLOR)");
app.add_flag(
"--no-detailed-logs",
sparseLogsOnly,
"Do not enable this unless you know what you are doing."
);
/// ---
QStringOption logpath;
auto* readLog = app.add_subcommand("read-log", "Read a quickshell log file.");
@ -143,7 +150,7 @@ int qs_main(int argc, char** argv) {
const auto qApplication = QCoreApplication(qArgC, qArgV);
// Start log manager - has to happen with an active event loop or offthread can't be started.
LogManager::init(!noColor);
LogManager::init(!noColor, sparseLogsOnly);
if (*readLog) {
auto file = QFile(*logpath);