Add -debuglogfile
option
This patch adds an option to configure the name and/or directory of the debug log. The user can specify either a relative path, in which case the path is relative to the data directory. They can also specify an absolute path to put the log anywhere else in the file system.
This commit is contained in:
parent
16fff80257
commit
cf5f432c69
3 changed files with 35 additions and 14 deletions
|
@ -342,6 +342,7 @@ std::string HelpMessage(HelpMessageMode mode)
|
||||||
if (showDebug)
|
if (showDebug)
|
||||||
strUsage += HelpMessageOpt("-feefilter", strprintf("Tell other nodes to filter invs to us by our mempool min fee (default: %u)", DEFAULT_FEEFILTER));
|
strUsage += HelpMessageOpt("-feefilter", strprintf("Tell other nodes to filter invs to us by our mempool min fee (default: %u)", DEFAULT_FEEFILTER));
|
||||||
strUsage += HelpMessageOpt("-loadblock=<file>", _("Imports blocks from external blk000??.dat file on startup"));
|
strUsage += HelpMessageOpt("-loadblock=<file>", _("Imports blocks from external blk000??.dat file on startup"));
|
||||||
|
strUsage += HelpMessageOpt("-debuglogfile=<file>", strprintf(_("Specify location of debug log file: this can be an absolute path or a path relative to the data directory (default: %s)"), DEFAULT_DEBUGLOGFILE));
|
||||||
strUsage += HelpMessageOpt("-maxorphantx=<n>", strprintf(_("Keep at most <n> unconnectable transactions in memory (default: %u)"), DEFAULT_MAX_ORPHAN_TRANSACTIONS));
|
strUsage += HelpMessageOpt("-maxorphantx=<n>", strprintf(_("Keep at most <n> unconnectable transactions in memory (default: %u)"), DEFAULT_MAX_ORPHAN_TRANSACTIONS));
|
||||||
strUsage += HelpMessageOpt("-maxmempool=<n>", strprintf(_("Keep the transaction memory pool below <n> megabytes (default: %u)"), DEFAULT_MAX_MEMPOOL_SIZE));
|
strUsage += HelpMessageOpt("-maxmempool=<n>", strprintf(_("Keep the transaction memory pool below <n> megabytes (default: %u)"), DEFAULT_MAX_MEMPOOL_SIZE));
|
||||||
strUsage += HelpMessageOpt("-mempoolexpiry=<n>", strprintf(_("Do not keep transactions in the mempool longer than <n> hours (default: %u)"), DEFAULT_MEMPOOL_EXPIRY));
|
strUsage += HelpMessageOpt("-mempoolexpiry=<n>", strprintf(_("Do not keep transactions in the mempool longer than <n> hours (default: %u)"), DEFAULT_MEMPOOL_EXPIRY));
|
||||||
|
@ -1209,8 +1210,11 @@ bool AppInitMain(boost::thread_group& threadGroup, CScheduler& scheduler)
|
||||||
ShrinkDebugFile();
|
ShrinkDebugFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fPrintToDebugLog)
|
if (fPrintToDebugLog) {
|
||||||
OpenDebugLog();
|
if (!OpenDebugLog()) {
|
||||||
|
return InitError(strprintf("Could not open debug log file %s", GetDebugLogPath().string()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!fLogTimestamps)
|
if (!fLogTimestamps)
|
||||||
LogPrintf("Startup time: %s\n", DateTimeStrFormat("%Y-%m-%d %H:%M:%S", GetTime()));
|
LogPrintf("Startup time: %s\n", DateTimeStrFormat("%Y-%m-%d %H:%M:%S", GetTime()));
|
||||||
|
|
27
src/util.cpp
27
src/util.cpp
|
@ -89,6 +89,7 @@ const int64_t nStartupTime = GetTime();
|
||||||
|
|
||||||
const char * const BITCOIN_CONF_FILENAME = "bitcoin.conf";
|
const char * const BITCOIN_CONF_FILENAME = "bitcoin.conf";
|
||||||
const char * const BITCOIN_PID_FILENAME = "bitcoind.pid";
|
const char * const BITCOIN_PID_FILENAME = "bitcoind.pid";
|
||||||
|
const char * const DEFAULT_DEBUGLOGFILE = "debug.log";
|
||||||
|
|
||||||
ArgsManager gArgs;
|
ArgsManager gArgs;
|
||||||
bool fPrintToConsole = false;
|
bool fPrintToConsole = false;
|
||||||
|
@ -189,26 +190,40 @@ static void DebugPrintInit()
|
||||||
vMsgsBeforeOpenLog = new std::list<std::string>;
|
vMsgsBeforeOpenLog = new std::list<std::string>;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenDebugLog()
|
fs::path GetDebugLogPath()
|
||||||
|
{
|
||||||
|
fs::path logfile(gArgs.GetArg("-debuglogfile", DEFAULT_DEBUGLOGFILE));
|
||||||
|
if (logfile.is_absolute()) {
|
||||||
|
return logfile;
|
||||||
|
} else {
|
||||||
|
return GetDataDir() / logfile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OpenDebugLog()
|
||||||
{
|
{
|
||||||
boost::call_once(&DebugPrintInit, debugPrintInitFlag);
|
boost::call_once(&DebugPrintInit, debugPrintInitFlag);
|
||||||
boost::mutex::scoped_lock scoped_lock(*mutexDebugLog);
|
boost::mutex::scoped_lock scoped_lock(*mutexDebugLog);
|
||||||
|
|
||||||
assert(fileout == nullptr);
|
assert(fileout == nullptr);
|
||||||
assert(vMsgsBeforeOpenLog);
|
assert(vMsgsBeforeOpenLog);
|
||||||
fs::path pathDebug = GetDataDir() / "debug.log";
|
fs::path pathDebug = GetDebugLogPath();
|
||||||
|
|
||||||
fileout = fsbridge::fopen(pathDebug, "a");
|
fileout = fsbridge::fopen(pathDebug, "a");
|
||||||
if (fileout) {
|
if (!fileout) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
setbuf(fileout, nullptr); // unbuffered
|
setbuf(fileout, nullptr); // unbuffered
|
||||||
// dump buffered messages from before we opened the log
|
// dump buffered messages from before we opened the log
|
||||||
while (!vMsgsBeforeOpenLog->empty()) {
|
while (!vMsgsBeforeOpenLog->empty()) {
|
||||||
FileWriteStr(vMsgsBeforeOpenLog->front(), fileout);
|
FileWriteStr(vMsgsBeforeOpenLog->front(), fileout);
|
||||||
vMsgsBeforeOpenLog->pop_front();
|
vMsgsBeforeOpenLog->pop_front();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
delete vMsgsBeforeOpenLog;
|
delete vMsgsBeforeOpenLog;
|
||||||
vMsgsBeforeOpenLog = nullptr;
|
vMsgsBeforeOpenLog = nullptr;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CLogCategoryDesc
|
struct CLogCategoryDesc
|
||||||
|
@ -355,7 +370,7 @@ int LogPrintStr(const std::string &str)
|
||||||
// reopen the log file, if requested
|
// reopen the log file, if requested
|
||||||
if (fReopenDebugLog) {
|
if (fReopenDebugLog) {
|
||||||
fReopenDebugLog = false;
|
fReopenDebugLog = false;
|
||||||
fs::path pathDebug = GetDataDir() / "debug.log";
|
fs::path pathDebug = GetDebugLogPath();
|
||||||
if (fsbridge::freopen(pathDebug,"a",fileout) != nullptr)
|
if (fsbridge::freopen(pathDebug,"a",fileout) != nullptr)
|
||||||
setbuf(fileout, nullptr); // unbuffered
|
setbuf(fileout, nullptr); // unbuffered
|
||||||
}
|
}
|
||||||
|
@ -774,7 +789,7 @@ void ShrinkDebugFile()
|
||||||
// Amount of debug.log to save at end when shrinking (must fit in memory)
|
// Amount of debug.log to save at end when shrinking (must fit in memory)
|
||||||
constexpr size_t RECENT_DEBUG_HISTORY_SIZE = 10 * 1000000;
|
constexpr size_t RECENT_DEBUG_HISTORY_SIZE = 10 * 1000000;
|
||||||
// Scroll debug.log if it's getting too big
|
// Scroll debug.log if it's getting too big
|
||||||
fs::path pathLog = GetDataDir() / "debug.log";
|
fs::path pathLog = GetDebugLogPath();
|
||||||
FILE* file = fsbridge::fopen(pathLog, "r");
|
FILE* file = fsbridge::fopen(pathLog, "r");
|
||||||
// If debug.log file is more than 10% bigger the RECENT_DEBUG_HISTORY_SIZE
|
// If debug.log file is more than 10% bigger the RECENT_DEBUG_HISTORY_SIZE
|
||||||
// trim it down by saving only the last RECENT_DEBUG_HISTORY_SIZE bytes
|
// trim it down by saving only the last RECENT_DEBUG_HISTORY_SIZE bytes
|
||||||
|
|
|
@ -36,6 +36,7 @@ int64_t GetStartupTime();
|
||||||
static const bool DEFAULT_LOGTIMEMICROS = false;
|
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;
|
||||||
|
extern const char * const DEFAULT_DEBUGLOGFILE;
|
||||||
|
|
||||||
/** Signals for translation. */
|
/** Signals for translation. */
|
||||||
class CTranslationInterface
|
class CTranslationInterface
|
||||||
|
@ -180,7 +181,8 @@ void CreatePidFile(const fs::path &path, pid_t pid);
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
fs::path GetSpecialFolderPath(int nFolder, bool fCreate = true);
|
fs::path GetSpecialFolderPath(int nFolder, bool fCreate = true);
|
||||||
#endif
|
#endif
|
||||||
void OpenDebugLog();
|
fs::path GetDebugLogPath();
|
||||||
|
bool OpenDebugLog();
|
||||||
void ShrinkDebugFile();
|
void ShrinkDebugFile();
|
||||||
void runCommand(const std::string& strCommand);
|
void runCommand(const std::string& strCommand);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue