diff --git a/src/init.cpp b/src/init.cpp index ccaa09a85ed..c0eb746d7b7 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -963,24 +963,18 @@ bool AppInitParameterInteraction() if (std::none_of(categories.begin(), categories.end(), [](std::string cat){return cat == "0" || cat == "none";})) { for (const auto& cat : categories) { - uint32_t flag = 0; - if (!GetLogCategory(&flag, &cat)) { + if (!g_logger->EnableCategory(cat)) { InitWarning(strprintf(_("Unsupported logging category %s=%s."), "-debug", cat)); - continue; } - g_logger->EnableCategory(static_cast(flag)); } } } // Now remove the logging categories which were explicitly excluded for (const std::string& cat : gArgs.GetArgs("-debugexclude")) { - uint32_t flag = 0; - if (!GetLogCategory(&flag, &cat)) { + if (!g_logger->DisableCategory(cat)) { InitWarning(strprintf(_("Unsupported logging category %s=%s."), "-debugexclude", cat)); - continue; } - g_logger->DisableCategory(static_cast(flag)); } // Check for -debugnet diff --git a/src/logging.cpp b/src/logging.cpp index 7604c0fd941..dc1ed0afb61 100644 --- a/src/logging.cpp +++ b/src/logging.cpp @@ -5,7 +5,6 @@ #include #include -#include const char * const DEFAULT_DEBUGLOGFILE = "debug.log"; @@ -64,11 +63,27 @@ void BCLog::Logger::EnableCategory(BCLog::LogFlags flag) logCategories |= flag; } +bool BCLog::Logger::EnableCategory(const std::string& str) +{ + BCLog::LogFlags flag; + if (!GetLogCategory(flag, str)) return false; + EnableCategory(flag); + return true; +} + void BCLog::Logger::DisableCategory(BCLog::LogFlags flag) { logCategories &= ~flag; } +bool BCLog::Logger::DisableCategory(const std::string& str) +{ + BCLog::LogFlags flag; + if (!GetLogCategory(flag, str)) return false; + DisableCategory(flag); + return true; +} + bool BCLog::Logger::WillLogCategory(BCLog::LogFlags category) const { return (logCategories.load(std::memory_order_relaxed) & category) != 0; @@ -81,7 +96,7 @@ bool BCLog::Logger::DefaultShrinkDebugFile() const struct CLogCategoryDesc { - uint32_t flag; + BCLog::LogFlags flag; std::string category; }; @@ -114,19 +129,17 @@ const CLogCategoryDesc LogCategories[] = {BCLog::ALL, "all"}, }; -bool GetLogCategory(uint32_t *f, const std::string *str) +bool GetLogCategory(BCLog::LogFlags& flag, const std::string& str) { - if (f && str) { - if (*str == "") { - *f = BCLog::ALL; + if (str == "") { + flag = BCLog::ALL; + return true; + } + for (const CLogCategoryDesc& category_desc : LogCategories) { + if (category_desc.category == str) { + flag = category_desc.flag; return true; } - for (unsigned int i = 0; i < ARRAYLEN(LogCategories); i++) { - if (LogCategories[i].category == *str) { - *f = LogCategories[i].flag; - return true; - } - } } return false; } @@ -135,11 +148,11 @@ std::string ListLogCategories() { std::string ret; int outcount = 0; - for (unsigned int i = 0; i < ARRAYLEN(LogCategories); i++) { + for (const CLogCategoryDesc& category_desc : LogCategories) { // Omit the special cases. - if (LogCategories[i].flag != BCLog::NONE && LogCategories[i].flag != BCLog::ALL) { + if (category_desc.flag != BCLog::NONE && category_desc.flag != BCLog::ALL) { if (outcount != 0) ret += ", "; - ret += LogCategories[i].category; + ret += category_desc.category; outcount++; } } @@ -149,12 +162,12 @@ std::string ListLogCategories() std::vector ListActiveLogCategories() { std::vector ret; - for (unsigned int i = 0; i < ARRAYLEN(LogCategories); i++) { + for (const CLogCategoryDesc& category_desc : LogCategories) { // Omit the special cases. - if (LogCategories[i].flag != BCLog::NONE && LogCategories[i].flag != BCLog::ALL) { + if (category_desc.flag != BCLog::NONE && category_desc.flag != BCLog::ALL) { CLogCategoryActive catActive; - catActive.category = LogCategories[i].category; - catActive.active = LogAcceptCategory(LogCategories[i].flag); + catActive.category = category_desc.category; + catActive.active = LogAcceptCategory(category_desc.flag); ret.push_back(catActive); } } diff --git a/src/logging.h b/src/logging.h index 7a1c25233ad..b88c9d9919f 100644 --- a/src/logging.h +++ b/src/logging.h @@ -95,8 +95,12 @@ namespace BCLog { void ShrinkDebugFile(); uint32_t GetCategoryMask() const { return logCategories.load(); } + void EnableCategory(LogFlags flag); + bool EnableCategory(const std::string& str); void DisableCategory(LogFlags flag); + bool DisableCategory(const std::string& str); + bool WillLogCategory(LogFlags category) const; bool DefaultShrinkDebugFile() const; @@ -118,8 +122,8 @@ std::string ListLogCategories(); /** Returns a vector of the active log categories. */ std::vector ListActiveLogCategories(); -/** Return true if str parses as a log category and set the flags in f */ -bool GetLogCategory(uint32_t *f, const std::string *str); +/** Return true if str parses as a log category and set the flag */ +bool GetLogCategory(BCLog::LogFlags& flag, const std::string& str); /** Get format string from VA_ARGS for error reporting */ template std::string FormatStringFromLogArgs(const char *fmt, const Args&... args) { return fmt; } diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp index 26bf21356e5..0c93108bcec 100644 --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -349,18 +349,17 @@ UniValue getmemoryinfo(const JSONRPCRequest& request) void EnableOrDisableLogCategories(UniValue cats, bool enable) { cats = cats.get_array(); for (unsigned int i = 0; i < cats.size(); ++i) { - uint32_t flag = 0; std::string cat = cats[i].get_str(); - if (!GetLogCategory(&flag, &cat)) { - throw JSONRPCError(RPC_INVALID_PARAMETER, "unknown logging category " + cat); - } - if (flag == BCLog::NONE) { - return; - } + + bool success; if (enable) { - g_logger->EnableCategory(static_cast(flag)); + success = g_logger->EnableCategory(cat); } else { - g_logger->DisableCategory(static_cast(flag)); + success = g_logger->DisableCategory(cat); + } + + if (!success) { + throw JSONRPCError(RPC_INVALID_PARAMETER, "unknown logging category " + cat); } } }