From 48dd263cd9e915a87f968f1e49bc3fadacade2d8 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Mon, 25 Apr 2022 14:13:13 +0200 Subject: [PATCH] Allow configuring warning/info/debug logging levels --- data/debug-interface/script.js | 12 ++-- data/debug-interface/styles.css | 46 ++++++++++++ libnymea-core/debugserverhandler.cpp | 104 +++++++++++++++++++-------- 3 files changed, 126 insertions(+), 36 deletions(-) diff --git a/data/debug-interface/script.js b/data/debug-interface/script.js index 68417699..7f62c05a 100644 --- a/data/debug-interface/script.js +++ b/data/debug-interface/script.js @@ -145,23 +145,23 @@ function loadLoggingCategorySettings() { for (var loggingCategory in responseMap['loggingCategories']) { var loggingCategoryElement = document.getElementById("debug-category-" + loggingCategory) - loggingCategoryElement.checked = responseMap['loggingCategories'][loggingCategory] + console.log("Setting category", loggingCategory, "to", responseMap['loggingCategories'][loggingCategory]) + loggingCategoryElement.value = responseMap['loggingCategories'][loggingCategory] } for (var loggingCategory in responseMap['loggingCategoriesPlugins']) { var loggingCategoryElement = document.getElementById("debug-category-" + loggingCategory) - loggingCategoryElement.checked = responseMap['loggingCategoriesPlugins'][loggingCategory] + loggingCategoryElement.value = responseMap['loggingCategoriesPlugins'][loggingCategory] } } } } -function toggleLoggingCategory(categoryName) { - var switchElement = document.getElementById("debug-category-" + categoryName) - console.log("Toggle logging category", categoryName, switchElement.checked) +function toggleLoggingCategory(categoryName, obj) { + console.log("Select changed:", categoryName, obj.value) - var fileRequestUrl = "/debug/logging-categories?" + categoryName + "=" + (switchElement.checked ? "true" : "false"); + var fileRequestUrl = "/debug/logging-categories?" + categoryName + "=" + obj.value; // Request report file generation var request = new XMLHttpRequest(); diff --git a/data/debug-interface/styles.css b/data/debug-interface/styles.css index 7dfa353b..54ee1b6e 100644 --- a/data/debug-interface/styles.css +++ b/data/debug-interface/styles.css @@ -283,6 +283,52 @@ button::-moz-focus-inner { border: 0; } flex-grow: 1; } +.debug-select { + box-sizing: border-box; + margin: 0; + border-radius: 4px; + font: inherit; +} + +.debug-select { + max-width: 100%; + width: 100%; + border: 0 none; + padding: 0 10px; + background: #fff; + color: #666; + border: 1px solid #e5e5e5; + transition: .2s ease-in-out; + transition-property: color,background-color,border; +} + +.debug-select:not([multiple]):not([size]) { + -webkit-appearance: none; + -moz-appearance: none; + padding-right: 20px; + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2224%22%20height%3D%2216%22%20viewBox%3D%220%200%2024%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23666%22%20points%3D%2212%201%209%206%2015%206%22%20%2F%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23666%22%20points%3D%2212%2013%209%208%2015%208%22%20%2F%3E%0A%3C%2Fsvg%3E%0A"); + background-repeat: no-repeat; + background-position: 100% 50%; +} + + +.debug-select:not([multiple]):not([size]) { + height: 40px; + vertical-align: middle; + display: inline-block; +} + +.debug-select:not([multiple]):not([size]) option { + color: #666; +} + +.debug-select:focus { + outline:0; + background-color: #fff; + color: #666; + border-color: #57baae; +} + /* The switch - the box around the slider */ .switch { position: relative; diff --git a/libnymea-core/debugserverhandler.cpp b/libnymea-core/debugserverhandler.cpp index 2444b502..2ba6a769 100644 --- a/libnymea-core/debugserverhandler.cpp +++ b/libnymea-core/debugserverhandler.cpp @@ -410,12 +410,32 @@ HttpReply *DebugServerHandler::processDebugRequest(const QString &requestPath, c QVariantMap dataMap; QVariantMap loggingCategories; foreach (const QString &loggingCategory, NymeaCore::loggingFilters()) { - loggingCategories.insert(loggingCategory, settings.value(QString("%1.debug").arg(loggingCategory), false).toBool()); + QString level = "critical"; + if (settings.value(QString("%1.warning").arg(loggingCategory), true).toBool()) { + level = "warning"; + } + if (settings.value(QString("%1.info").arg(loggingCategory), true).toBool()) { + level = "info"; + } + if (settings.value(QString("%1.debug").arg(loggingCategory), false).toBool()) { + level = "debug"; + } + loggingCategories.insert(loggingCategory, level); } dataMap.insert("loggingCategories", loggingCategories); QVariantMap loggingCategoriesPlugins; foreach (const QString &loggingCategory, NymeaCore::loggingFiltersPlugins()) { - loggingCategoriesPlugins.insert(loggingCategory, settings.value(QString("%1.debug").arg(loggingCategory), false).toBool()); + QString level = "critical"; + if (settings.value(QString("%1.warning").arg(loggingCategory), true).toBool()) { + level = "warning"; + } + if (settings.value(QString("%1.info").arg(loggingCategory), true).toBool()) { + level = "info"; + } + if (settings.value(QString("%1.debug").arg(loggingCategory), false).toBool()) { + level = "debug"; + } + loggingCategoriesPlugins.insert(loggingCategory, level); } dataMap.insert("loggingCategoriesPlugins", loggingCategoriesPlugins); @@ -434,9 +454,25 @@ HttpReply *DebugServerHandler::processDebugRequest(const QString &requestPath, c continue; } - bool enabled = QVariant(requestQuery.queryItems().at(i).second).toBool(); - qCDebug(dcDebugServer()) << "Logging category" << category << (enabled ? "enabled" : "disabled"); - settings.setValue(QString("%1.debug").arg(category), (enabled ? "true" : "false")); + QString level = QVariant(requestQuery.queryItems().at(i).second).toString(); + qCDebug(dcDebugServer()) << "Logging category" << category << level; + if (level == "debug") { + settings.setValue(QString("%1.debug").arg(category), true); + settings.setValue(QString("%1.info").arg(category), true); + settings.setValue(QString("%1.warning").arg(category), true); + } else if (level == "info") { + settings.setValue(QString("%1.debug").arg(category), false); + settings.setValue(QString("%1.info").arg(category), true); + settings.setValue(QString("%1.warning").arg(category), true); + } else if (level == "warning"){ + settings.setValue(QString("%1.debug").arg(category), false); + settings.setValue(QString("%1.info").arg(category), false); + settings.setValue(QString("%1.warning").arg(category), true); + } else { + settings.setValue(QString("%1.debug").arg(category), false); + settings.setValue(QString("%1.info").arg(category), false); + settings.setValue(QString("%1.warning").arg(category), false); + } } // Update logging filter rules according to the nw settings @@ -1806,22 +1842,29 @@ QByteArray DebugServerHandler::createDebugXmlDocument() QStringList loggingCategories = NymeaCore::loggingFilters(); loggingCategories.sort(); + QHash categoryMap = { + {"debug", "🐞 Debug"}, + {"info", "â„šī¸ Info"}, + {"warning", "âš ī¸ Warning"}, + {"critical", "đŸ”Ĩ Critical"} + }; foreach (const QString &loggingCategory, loggingCategories) { writer.writeStartElement("div"); - writer.writeAttribute("class", "debug-category"); - writer.writeTextElement("p", loggingCategory); - writer.writeStartElement("label"); - writer.writeAttribute("class", "switch"); - writer.writeStartElement("input"); - writer.writeAttribute("id", QString("debug-category-%1").arg(loggingCategory)); - writer.writeAttribute("type", "checkbox"); - writer.writeAttribute("onclick", QString("toggleLoggingCategory('%1')").arg(loggingCategory)); - writer.writeEndElement(); // input - writer.writeStartElement("span"); - writer.writeAttribute("class", "slider round"); - writer.writeCharacters(""); - writer.writeEndElement(); // span - writer.writeEndElement(); // label + writer.writeAttribute("class", "debug-category"); + writer.writeTextElement("p", loggingCategory); + writer.writeStartElement("label"); + writer.writeStartElement("select"); + writer.writeAttribute("class", "debug-select"); + writer.writeAttribute("onchange", QString("toggleLoggingCategory('%1', this)").arg(loggingCategory)); + writer.writeAttribute("id", QString("debug-category-%1").arg(loggingCategory)); + foreach (const QString &option, QStringList({"debug", "info", "warning", "critical"})) { + writer.writeStartElement("option"); + writer.writeAttribute("value", option); + writer.writeCharacters(categoryMap.value(option)); + writer.writeEndElement(); + } + writer.writeEndElement(); // select + writer.writeEndElement(); // label writer.writeEndElement(); // div debug-category } @@ -1842,16 +1885,17 @@ QByteArray DebugServerHandler::createDebugXmlDocument() writer.writeAttribute("class", "debug-category"); writer.writeTextElement("p", loggingCategory); writer.writeStartElement("label"); - writer.writeAttribute("class", "switch"); - writer.writeStartElement("input"); - writer.writeAttribute("id", QString("debug-category-%1").arg(loggingCategory)); - writer.writeAttribute("type", "checkbox"); - writer.writeAttribute("onclick", QString("toggleLoggingCategory('%1')").arg(loggingCategory)); - writer.writeEndElement(); // input - writer.writeStartElement("span"); - writer.writeAttribute("class", "slider round"); - writer.writeCharacters(""); - writer.writeEndElement(); // span + writer.writeStartElement("select"); + writer.writeAttribute("class", "debug-select"); + writer.writeAttribute("onchange", QString("toggleLoggingCategory('%1', this)").arg(loggingCategory)); + writer.writeAttribute("id", QString("debug-category-%1").arg(loggingCategory)); + foreach (const QString &option, QStringList({"debug", "info", "warning", "critical"})) { + writer.writeStartElement("option"); + writer.writeAttribute("value", option); + writer.writeCharacters(categoryMap.value(option)); + writer.writeEndElement(); + } + writer.writeEndElement(); // select writer.writeEndElement(); // label writer.writeEndElement(); // div debug-category } @@ -1867,7 +1911,7 @@ QByteArray DebugServerHandler::createDebugXmlDocument() writer.writeAttribute("class", "footer"); writer.writeTextElement("p", QString("Copyright %1 %2 nymea GmbH.").arg(QChar(0xA9)).arg(COPYRIGHT_YEAR_STRING)); //: The footer license note of the debug interface - writer.writeTextElement("p", tr("Released under the GNU GENERAL PUBLIC LICENSE Version 2.")); + writer.writeTextElement("p", tr("Released under the GNU GENERAL PUBLIC LICENSE Version 3.")); writer.writeEndElement(); // div footer writer.writeEndElement(); // div container