mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-12 11:19:08 -05:00
Merge bitcoin/bitcoin#29798: Logging cleanup
a7432dd6ed
logging: clarify -debug and -debugexclude descriptions (Anthony Towns)74dd33cb0a
rpc: make logging method reject "0" category and correct the help text (Vasil Dimov)8c6f3bf163
logging, refactor: minor encapsulation improvement and use BCLog::NONE instead of 0 (Vasil Dimov)160706aa38
logging, refactor: make category special cases explicit (Ryan Ofsky) Pull request description: * Move special cases from `LOG_CATEGORIES_BY_STR` to `GetLogCategory()` (suggested [here](https://github.com/bitcoin/bitcoin/pull/29419#discussion_r1547990373)). * Remove `"none"` and `"0"` from RPC `logging` help because that help text was wrong. `"none"` resulted in an error and `"0"` was ignored itself (contrary to what the help text suggested). * Remove unused `LOG_CATEGORIES_BY_STR[""]` (suggested [here](https://github.com/bitcoin/bitcoin/pull/29419#discussion_r1548018694)). This is a followup to https://github.com/bitcoin/bitcoin/pull/29419, addressing leftover suggestions + more. ACKs for top commit: LarryRuane: ACKa7432dd6ed
ryanofsky: Code review ACKa7432dd6ed
. Only changes since last review are removing dead if statement and adding AJ's suggested -debug and -debugexclude help improvements, which look accurate and much more clear. Tree-SHA512: 41b997b06fccdb4c1d31f57d4752c83caa744cb3280276a337ef4a9b7012a04eb945071db6b8fad24c6a6cf8761f2f800fe6d8f3d8836f5b39c25e4f11c85bf0
This commit is contained in:
commit
55d19945ef
4 changed files with 14 additions and 20 deletions
|
@ -27,9 +27,9 @@ void AddLoggingArgs(ArgsManager& argsman)
|
||||||
{
|
{
|
||||||
argsman.AddArg("-debuglogfile=<file>", strprintf("Specify location of debug log file (default: %s). Relative paths will be prefixed by a net-specific datadir location. Pass -nodebuglogfile to disable writing the log to a file.", DEFAULT_DEBUGLOGFILE), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
argsman.AddArg("-debuglogfile=<file>", strprintf("Specify location of debug log file (default: %s). Relative paths will be prefixed by a net-specific datadir location. Pass -nodebuglogfile to disable writing the log to a file.", DEFAULT_DEBUGLOGFILE), ArgsManager::ALLOW_ANY, OptionsCategory::OPTIONS);
|
||||||
argsman.AddArg("-debug=<category>", "Output debug and trace logging (default: -nodebug, supplying <category> is optional). "
|
argsman.AddArg("-debug=<category>", "Output debug and trace logging (default: -nodebug, supplying <category> is optional). "
|
||||||
"If <category> is not supplied or if <category> = 1, output all debug and trace logging. <category> can be: " + LogInstance().LogCategoriesString() + ". This option can be specified multiple times to output multiple categories.",
|
"If <category> is not supplied or if <category> is 1 or \"all\", output all debug logging. If <category> is 0 or \"none\", any other categories are ignored. Other valid values for <category> are: " + LogInstance().LogCategoriesString() + ". This option can be specified multiple times to output multiple categories.",
|
||||||
ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-debugexclude=<category>", "Exclude debug and trace logging for a category. Can be used in conjunction with -debug=1 to output debug and trace logging for all categories except the specified category. This option can be specified multiple times to exclude multiple categories.", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-debugexclude=<category>", "Exclude debug and trace logging for a category. Can be used in conjunction with -debug=1 to output debug and trace logging for all categories except the specified category. This option can be specified multiple times to exclude multiple categories. This takes priority over \"-debug\"", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-logips", strprintf("Include IP addresses in debug output (default: %u)", DEFAULT_LOGIPS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-logips", strprintf("Include IP addresses in debug output (default: %u)", DEFAULT_LOGIPS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-loglevel=<level>|<category>:<level>", strprintf("Set the global or per-category severity level for logging categories enabled with the -debug configuration option or the logging RPC. Possible values are %s (default=%s). The following levels are always logged: error, warning, info. If <category>:<level> is supplied, the setting will override the global one and may be specified multiple times to set multiple category-specific levels. <category> can be: %s.", LogInstance().LogLevelsString(), LogInstance().LogLevelToStr(BCLog::DEFAULT_LOG_LEVEL), LogInstance().LogCategoriesString()), ArgsManager::DISALLOW_NEGATION | ArgsManager::DISALLOW_ELISION | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-loglevel=<level>|<category>:<level>", strprintf("Set the global or per-category severity level for logging categories enabled with the -debug configuration option or the logging RPC. Possible values are %s (default=%s). The following levels are always logged: error, warning, info. If <category>:<level> is supplied, the setting will override the global one and may be specified multiple times to set multiple category-specific levels. <category> can be: %s.", LogInstance().LogLevelsString(), LogInstance().LogLevelToStr(BCLog::DEFAULT_LOG_LEVEL), LogInstance().LogCategoriesString()), ArgsManager::DISALLOW_NEGATION | ArgsManager::DISALLOW_ELISION | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-logtimestamps", strprintf("Prepend debug output with timestamp (default: %u)", DEFAULT_LOGTIMESTAMPS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-logtimestamps", strprintf("Prepend debug output with timestamp (default: %u)", DEFAULT_LOGTIMESTAMPS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
|
|
|
@ -168,8 +168,6 @@ bool BCLog::Logger::DefaultShrinkDebugFile() const
|
||||||
}
|
}
|
||||||
|
|
||||||
static const std::map<std::string, BCLog::LogFlags, std::less<>> LOG_CATEGORIES_BY_STR{
|
static const std::map<std::string, BCLog::LogFlags, std::less<>> LOG_CATEGORIES_BY_STR{
|
||||||
{"0", BCLog::NONE},
|
|
||||||
{"", BCLog::NONE},
|
|
||||||
{"net", BCLog::NET},
|
{"net", BCLog::NET},
|
||||||
{"tor", BCLog::TOR},
|
{"tor", BCLog::TOR},
|
||||||
{"mempool", BCLog::MEMPOOL},
|
{"mempool", BCLog::MEMPOOL},
|
||||||
|
@ -201,8 +199,6 @@ static const std::map<std::string, BCLog::LogFlags, std::less<>> LOG_CATEGORIES_
|
||||||
{"txreconciliation", BCLog::TXRECONCILIATION},
|
{"txreconciliation", BCLog::TXRECONCILIATION},
|
||||||
{"scan", BCLog::SCAN},
|
{"scan", BCLog::SCAN},
|
||||||
{"txpackages", BCLog::TXPACKAGES},
|
{"txpackages", BCLog::TXPACKAGES},
|
||||||
{"1", BCLog::ALL},
|
|
||||||
{"all", BCLog::ALL},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const std::unordered_map<BCLog::LogFlags, std::string> LOG_CATEGORIES_BY_FLAG{
|
static const std::unordered_map<BCLog::LogFlags, std::string> LOG_CATEGORIES_BY_FLAG{
|
||||||
|
@ -210,11 +206,8 @@ static const std::unordered_map<BCLog::LogFlags, std::string> LOG_CATEGORIES_BY_
|
||||||
[](const auto& in) {
|
[](const auto& in) {
|
||||||
std::unordered_map<BCLog::LogFlags, std::string> out;
|
std::unordered_map<BCLog::LogFlags, std::string> out;
|
||||||
for (const auto& [k, v] : in) {
|
for (const auto& [k, v] : in) {
|
||||||
switch (v) {
|
const bool inserted{out.emplace(v, k).second};
|
||||||
case BCLog::NONE: out.emplace(BCLog::NONE, ""); break;
|
assert(inserted);
|
||||||
case BCLog::ALL: out.emplace(BCLog::ALL, "all"); break;
|
|
||||||
default: out.emplace(v, k);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}(LOG_CATEGORIES_BY_STR)
|
}(LOG_CATEGORIES_BY_STR)
|
||||||
|
@ -222,7 +215,7 @@ static const std::unordered_map<BCLog::LogFlags, std::string> LOG_CATEGORIES_BY_
|
||||||
|
|
||||||
bool GetLogCategory(BCLog::LogFlags& flag, std::string_view str)
|
bool GetLogCategory(BCLog::LogFlags& flag, std::string_view str)
|
||||||
{
|
{
|
||||||
if (str.empty()) {
|
if (str.empty() || str == "1" || str == "all") {
|
||||||
flag = BCLog::ALL;
|
flag = BCLog::ALL;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -251,8 +244,11 @@ std::string BCLog::Logger::LogLevelToStr(BCLog::Level level)
|
||||||
assert(false);
|
assert(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string LogCategoryToStr(BCLog::LogFlags category)
|
static std::string LogCategoryToStr(BCLog::LogFlags category)
|
||||||
{
|
{
|
||||||
|
if (category == BCLog::ALL) {
|
||||||
|
return "all";
|
||||||
|
}
|
||||||
auto it = LOG_CATEGORIES_BY_FLAG.find(category);
|
auto it = LOG_CATEGORIES_BY_FLAG.find(category);
|
||||||
assert(it != LOG_CATEGORIES_BY_FLAG.end());
|
assert(it != LOG_CATEGORIES_BY_FLAG.end());
|
||||||
return it->second;
|
return it->second;
|
||||||
|
@ -278,10 +274,9 @@ static std::optional<BCLog::Level> GetLogLevel(std::string_view level_str)
|
||||||
std::vector<LogCategory> BCLog::Logger::LogCategoriesList() const
|
std::vector<LogCategory> BCLog::Logger::LogCategoriesList() const
|
||||||
{
|
{
|
||||||
std::vector<LogCategory> ret;
|
std::vector<LogCategory> ret;
|
||||||
|
ret.reserve(LOG_CATEGORIES_BY_STR.size());
|
||||||
for (const auto& [category, flag] : LOG_CATEGORIES_BY_STR) {
|
for (const auto& [category, flag] : LOG_CATEGORIES_BY_STR) {
|
||||||
if (flag != BCLog::NONE && flag != BCLog::ALL) {
|
ret.push_back(LogCategory{.category = category, .active = WillLogCategory(flag)});
|
||||||
ret.push_back(LogCategory{.category = category, .active = WillLogCategory(flag)});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,7 +119,7 @@ namespace BCLog {
|
||||||
std::atomic<Level> m_log_level{DEFAULT_LOG_LEVEL};
|
std::atomic<Level> m_log_level{DEFAULT_LOG_LEVEL};
|
||||||
|
|
||||||
/** Log categories bitfield. */
|
/** Log categories bitfield. */
|
||||||
std::atomic<uint32_t> m_categories{0};
|
std::atomic<uint32_t> m_categories{BCLog::NONE};
|
||||||
|
|
||||||
void FormatLogStrInPlace(std::string& str, LogFlags category, Level level, std::string_view source_file, int source_line, std::string_view logging_function, std::string_view threadname, SystemClock::time_point now, std::chrono::seconds mocktime) const;
|
void FormatLogStrInPlace(std::string& str, LogFlags category, Level level, std::string_view source_file, int source_line, std::string_view logging_function, std::string_view threadname, SystemClock::time_point now, std::chrono::seconds mocktime) const;
|
||||||
|
|
||||||
|
@ -132,6 +132,8 @@ namespace BCLog {
|
||||||
void LogPrintStr_(std::string_view str, std::string_view logging_function, std::string_view source_file, int source_line, BCLog::LogFlags category, BCLog::Level level)
|
void LogPrintStr_(std::string_view str, std::string_view logging_function, std::string_view source_file, int source_line, BCLog::LogFlags category, BCLog::Level level)
|
||||||
EXCLUSIVE_LOCKS_REQUIRED(m_cs);
|
EXCLUSIVE_LOCKS_REQUIRED(m_cs);
|
||||||
|
|
||||||
|
std::string GetLogPrefix(LogFlags category, Level level) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool m_print_to_console = false;
|
bool m_print_to_console = false;
|
||||||
bool m_print_to_file = false;
|
bool m_print_to_file = false;
|
||||||
|
@ -145,8 +147,6 @@ namespace BCLog {
|
||||||
fs::path m_file_path;
|
fs::path m_file_path;
|
||||||
std::atomic<bool> m_reopen_file{false};
|
std::atomic<bool> m_reopen_file{false};
|
||||||
|
|
||||||
std::string GetLogPrefix(LogFlags category, Level level) const;
|
|
||||||
|
|
||||||
/** Send a string to the log output */
|
/** Send a string to the log output */
|
||||||
void LogPrintStr(std::string_view str, std::string_view logging_function, std::string_view source_file, int source_line, BCLog::LogFlags category, BCLog::Level level)
|
void LogPrintStr(std::string_view str, std::string_view logging_function, std::string_view source_file, int source_line, BCLog::LogFlags category, BCLog::Level level)
|
||||||
EXCLUSIVE_LOCKS_REQUIRED(!m_cs);
|
EXCLUSIVE_LOCKS_REQUIRED(!m_cs);
|
||||||
|
|
|
@ -221,7 +221,6 @@ static RPCHelpMan logging()
|
||||||
"The valid logging categories are: " + LogInstance().LogCategoriesString() + "\n"
|
"The valid logging categories are: " + LogInstance().LogCategoriesString() + "\n"
|
||||||
"In addition, the following are available as category names with special meanings:\n"
|
"In addition, the following are available as category names with special meanings:\n"
|
||||||
" - \"all\", \"1\" : represent all logging categories.\n"
|
" - \"all\", \"1\" : represent all logging categories.\n"
|
||||||
" - \"none\", \"0\" : even if other logging categories are specified, ignore all of them.\n"
|
|
||||||
,
|
,
|
||||||
{
|
{
|
||||||
{"include", RPCArg::Type::ARR, RPCArg::Optional::OMITTED, "The categories to add to debug logging",
|
{"include", RPCArg::Type::ARR, RPCArg::Optional::OMITTED, "The categories to add to debug logging",
|
||||||
|
|
Loading…
Add table
Reference in a new issue