mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-13 11:25:02 -05:00
log: Prefix log messages with function name if -logsourcelocations is set
This commit is contained in:
parent
29d2aeb4a2
commit
b4511e2e2e
8 changed files with 40 additions and 4 deletions
|
@ -532,6 +532,7 @@ void SetupServerArgs(NodeContext& node)
|
||||||
#else
|
#else
|
||||||
hidden_args.emplace_back("-logthreadnames");
|
hidden_args.emplace_back("-logthreadnames");
|
||||||
#endif
|
#endif
|
||||||
|
argsman.AddArg("-logsourcelocations", strprintf("Prepend debug output with name of the originating source location (source file, line number and function name) (default: %u)", DEFAULT_LOGSOURCELOCATIONS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-logtimemicros", strprintf("Add microsecond precision to debug timestamps (default: %u)", DEFAULT_LOGTIMEMICROS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-logtimemicros", strprintf("Add microsecond precision to debug timestamps (default: %u)", DEFAULT_LOGTIMEMICROS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-mocktime=<n>", "Replace actual time with " + UNIX_EPOCH_TIME + " (default: 0)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-mocktime=<n>", "Replace actual time with " + UNIX_EPOCH_TIME + " (default: 0)", ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
||||||
argsman.AddArg("-maxsigcachesize=<n>", strprintf("Limit sum of signature cache and script execution cache sizes to <n> MiB (default: %u)", DEFAULT_MAX_SIG_CACHE_SIZE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
argsman.AddArg("-maxsigcachesize=<n>", strprintf("Limit sum of signature cache and script execution cache sizes to <n> MiB (default: %u)", DEFAULT_MAX_SIG_CACHE_SIZE), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
|
||||||
|
@ -878,6 +879,7 @@ void InitLogging(const ArgsManager& args)
|
||||||
#ifdef HAVE_THREAD_LOCAL
|
#ifdef HAVE_THREAD_LOCAL
|
||||||
LogInstance().m_log_threadnames = args.GetBoolArg("-logthreadnames", DEFAULT_LOGTHREADNAMES);
|
LogInstance().m_log_threadnames = args.GetBoolArg("-logthreadnames", DEFAULT_LOGTHREADNAMES);
|
||||||
#endif
|
#endif
|
||||||
|
LogInstance().m_log_sourcelocations = args.GetBoolArg("-logsourcelocations", DEFAULT_LOGSOURCELOCATIONS);
|
||||||
|
|
||||||
fLogIPs = args.GetBoolArg("-logips", DEFAULT_LOGIPS);
|
fLogIPs = args.GetBoolArg("-logips", DEFAULT_LOGIPS);
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include <logging.h>
|
#include <logging.h>
|
||||||
#include <util/threadnames.h>
|
#include <util/threadnames.h>
|
||||||
|
#include <util/string.h>
|
||||||
#include <util/time.h>
|
#include <util/time.h>
|
||||||
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
@ -236,11 +237,15 @@ namespace BCLog {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BCLog::Logger::LogPrintStr(const std::string& str)
|
void BCLog::Logger::LogPrintStr(const std::string& str, const std::string& logging_function, const std::string& source_file, const int source_line)
|
||||||
{
|
{
|
||||||
StdLockGuard scoped_lock(m_cs);
|
StdLockGuard scoped_lock(m_cs);
|
||||||
std::string str_prefixed = LogEscapeMessage(str);
|
std::string str_prefixed = LogEscapeMessage(str);
|
||||||
|
|
||||||
|
if (m_log_sourcelocations && m_started_new_line) {
|
||||||
|
str_prefixed.insert(0, "[" + RemovePrefix(source_file, "./") + ":" + ToString(source_line) + "] [" + logging_function + "] ");
|
||||||
|
}
|
||||||
|
|
||||||
if (m_log_threadnames && m_started_new_line) {
|
if (m_log_threadnames && m_started_new_line) {
|
||||||
str_prefixed.insert(0, "[" + util::ThreadGetInternalName() + "] ");
|
str_prefixed.insert(0, "[" + util::ThreadGetInternalName() + "] ");
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ static const bool DEFAULT_LOGTIMEMICROS = false;
|
||||||
static const bool DEFAULT_LOGIPS = false;
|
static const bool DEFAULT_LOGIPS = false;
|
||||||
static const bool DEFAULT_LOGTIMESTAMPS = true;
|
static const bool DEFAULT_LOGTIMESTAMPS = true;
|
||||||
static const bool DEFAULT_LOGTHREADNAMES = false;
|
static const bool DEFAULT_LOGTHREADNAMES = false;
|
||||||
|
static const bool DEFAULT_LOGSOURCELOCATIONS = false;
|
||||||
extern const char * const DEFAULT_DEBUGLOGFILE;
|
extern const char * const DEFAULT_DEBUGLOGFILE;
|
||||||
|
|
||||||
extern bool fLogIPs;
|
extern bool fLogIPs;
|
||||||
|
@ -90,12 +91,13 @@ namespace BCLog {
|
||||||
bool m_log_timestamps = DEFAULT_LOGTIMESTAMPS;
|
bool m_log_timestamps = DEFAULT_LOGTIMESTAMPS;
|
||||||
bool m_log_time_micros = DEFAULT_LOGTIMEMICROS;
|
bool m_log_time_micros = DEFAULT_LOGTIMEMICROS;
|
||||||
bool m_log_threadnames = DEFAULT_LOGTHREADNAMES;
|
bool m_log_threadnames = DEFAULT_LOGTHREADNAMES;
|
||||||
|
bool m_log_sourcelocations = DEFAULT_LOGSOURCELOCATIONS;
|
||||||
|
|
||||||
fs::path m_file_path;
|
fs::path m_file_path;
|
||||||
std::atomic<bool> m_reopen_file{false};
|
std::atomic<bool> m_reopen_file{false};
|
||||||
|
|
||||||
/** Send a string to the log output */
|
/** Send a string to the log output */
|
||||||
void LogPrintStr(const std::string& str);
|
void LogPrintStr(const std::string& str, const std::string& logging_function, const std::string& source_file, const int source_line);
|
||||||
|
|
||||||
/** Returns whether logs will be written to any output */
|
/** Returns whether logs will be written to any output */
|
||||||
bool Enabled() const
|
bool Enabled() const
|
||||||
|
@ -163,7 +165,7 @@ bool GetLogCategory(BCLog::LogFlags& flag, const std::string& str);
|
||||||
// peer can fill up a user's disk with debug.log entries.
|
// peer can fill up a user's disk with debug.log entries.
|
||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
static inline void LogPrintf(const char* fmt, const Args&... args)
|
static inline void LogPrintf_(const std::string& logging_function, const std::string& source_file, const int source_line, const char* fmt, const Args&... args)
|
||||||
{
|
{
|
||||||
if (LogInstance().Enabled()) {
|
if (LogInstance().Enabled()) {
|
||||||
std::string log_msg;
|
std::string log_msg;
|
||||||
|
@ -173,10 +175,12 @@ static inline void LogPrintf(const char* fmt, const Args&... args)
|
||||||
/* Original format string will have newline so don't add one here */
|
/* Original format string will have newline so don't add one here */
|
||||||
log_msg = "Error \"" + std::string(fmterr.what()) + "\" while formatting log message: " + fmt;
|
log_msg = "Error \"" + std::string(fmterr.what()) + "\" while formatting log message: " + fmt;
|
||||||
}
|
}
|
||||||
LogInstance().LogPrintStr(log_msg);
|
LogInstance().LogPrintStr(log_msg, logging_function, source_file, source_line);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define LogPrintf(...) LogPrintf_(__func__, __FILE__, __LINE__, __VA_ARGS__)
|
||||||
|
|
||||||
// Use a macro instead of a function for conditional logging to prevent
|
// Use a macro instead of a function for conditional logging to prevent
|
||||||
// evaluating arguments when logging for the category is not enabled.
|
// evaluating arguments when logging for the category is not enabled.
|
||||||
#define LogPrint(category, ...) \
|
#define LogPrint(category, ...) \
|
||||||
|
|
|
@ -67,6 +67,7 @@ FUZZ_TARGET(string)
|
||||||
}
|
}
|
||||||
OutputType output_type;
|
OutputType output_type;
|
||||||
(void)ParseOutputType(random_string_1, output_type);
|
(void)ParseOutputType(random_string_1, output_type);
|
||||||
|
(void)RemovePrefix(random_string_1, random_string_2);
|
||||||
(void)ResolveErrMsg(random_string_1, random_string_2);
|
(void)ResolveErrMsg(random_string_1, random_string_2);
|
||||||
try {
|
try {
|
||||||
(void)RPCConvertNamedValues(random_string_1, random_string_vector);
|
(void)RPCConvertNamedValues(random_string_1, random_string_vector);
|
||||||
|
|
|
@ -77,6 +77,7 @@ BasicTestingSetup::BasicTestingSetup(const std::string& chainName, const std::ve
|
||||||
{
|
{
|
||||||
"dummy",
|
"dummy",
|
||||||
"-printtoconsole=0",
|
"-printtoconsole=0",
|
||||||
|
"-logsourcelocations",
|
||||||
"-logtimemicros",
|
"-logtimemicros",
|
||||||
"-logthreadnames",
|
"-logthreadnames",
|
||||||
"-debug",
|
"-debug",
|
||||||
|
|
|
@ -2200,4 +2200,17 @@ BOOST_AUTO_TEST_CASE(message_hash)
|
||||||
BOOST_CHECK_NE(message_hash1, signature_hash);
|
BOOST_CHECK_NE(message_hash1, signature_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(remove_prefix)
|
||||||
|
{
|
||||||
|
BOOST_CHECK_EQUAL(RemovePrefix("./util/system.h", "./"), "util/system.h");
|
||||||
|
BOOST_CHECK_EQUAL(RemovePrefix("foo", "foo"), "");
|
||||||
|
BOOST_CHECK_EQUAL(RemovePrefix("foo", "fo"), "o");
|
||||||
|
BOOST_CHECK_EQUAL(RemovePrefix("foo", "f"), "oo");
|
||||||
|
BOOST_CHECK_EQUAL(RemovePrefix("foo", ""), "foo");
|
||||||
|
BOOST_CHECK_EQUAL(RemovePrefix("fo", "foo"), "fo");
|
||||||
|
BOOST_CHECK_EQUAL(RemovePrefix("f", "foo"), "f");
|
||||||
|
BOOST_CHECK_EQUAL(RemovePrefix("", "foo"), "");
|
||||||
|
BOOST_CHECK_EQUAL(RemovePrefix("", ""), "");
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
|
@ -25,6 +25,14 @@
|
||||||
return str.substr(front, end - front + 1);
|
return str.substr(front, end - front + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] inline std::string RemovePrefix(const std::string& str, const std::string& prefix)
|
||||||
|
{
|
||||||
|
if (str.substr(0, prefix.size()) == prefix) {
|
||||||
|
return str.substr(prefix.size());
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Join a list of items
|
* Join a list of items
|
||||||
*
|
*
|
||||||
|
|
|
@ -114,6 +114,8 @@ class TestNode():
|
||||||
|
|
||||||
if self.version_is_at_least(190000):
|
if self.version_is_at_least(190000):
|
||||||
self.args.append("-logthreadnames")
|
self.args.append("-logthreadnames")
|
||||||
|
if self.version_is_at_least(219900):
|
||||||
|
self.args.append("-logsourcelocations")
|
||||||
|
|
||||||
self.cli = TestNodeCLI(bitcoin_cli, self.datadir)
|
self.cli = TestNodeCLI(bitcoin_cli, self.datadir)
|
||||||
self.use_cli = use_cli
|
self.use_cli = use_cli
|
||||||
|
|
Loading…
Add table
Reference in a new issue