Added command line parameters to disable logging

This commit is contained in:
SChernykh
2026-04-28 18:48:10 +02:00
parent 01da461069
commit 620b2e12f7
8 changed files with 90 additions and 44 deletions
+5
View File
@@ -24,6 +24,11 @@ on:
schedule:
- cron: '44 11 * * 0'
permissions:
actions: read
contents: read
security-events: write
jobs:
analyze:
name: Analyze
+3
View File
@@ -14,6 +14,9 @@
--loglevel Verbosity of the log, integer number between 0 and 6
--data-dir Path to store general p2pool files (log, cache, peer data, etc.), default is current directory
--log-file Path to the log file, default is "p2pool.log" in p2pool's working directory
--no-console-log Disable logging to the console
--no-log-file Disable logging to the file
--disable-log Equivalent to --no-console-log --no-log-file, disables logging entirely and saves ~8 MB of memory
--sidechain-config Name of the p2pool sidechain parameters file (only use it if you run your own sidechain)
--data-api Path to the p2pool JSON data (use it in tandem with an external web-server). Not affected by --data-dir setting!
--local-api Enable /local/ path in api path for Stratum Server and built-in miner statistics
+20 -41
View File
@@ -124,6 +124,8 @@ public:
, m_readPos(0)
, m_stopped(false)
, m_needReopen(false)
, m_consoleLogEnabled(p.m_consoleLogEnabled)
, m_logFileEnabled(p.m_logFileEnabled)
, m_logFileLastStatTime(0)
, m_workerWaiting(false)
{
@@ -131,8 +133,6 @@ public:
SetUnhandledExceptionFilter(UnhandledExceptionFilter);
#endif
set_main_thread();
std::setlocale(LC_ALL, "C");
m_logFilePath = p.m_logFilePath.empty() ? (p.m_dataDir + log_file_name) : p.m_logFilePath;
@@ -165,8 +165,6 @@ public:
CONSOLE_COLORS = false;
}
init_uv_threadpool();
err = uv_thread_create(&m_worker, run_wrapper, this);
if (err) {
fprintf(stderr, "failed to start logger thread (%s), aborting\n", uv_err_name(err));
@@ -199,7 +197,9 @@ public:
uv_cond_destroy(&m_cond);
uv_mutex_destroy(&m_mutex);
m_logFile.close();
if (m_logFileEnabled) {
m_logFile.close();
}
}
FORCEINLINE void write(const char* buf, uint32_t size)
@@ -209,7 +209,7 @@ public:
do {
if (writePos - m_readPos.load(std::memory_order_relaxed) > BUF_SIZE - SLOT_SIZE) {
// Buffer is full, can't log normally
if (size > 3) {
if ((size > 3) && m_consoleLogEnabled) {
fwrite(buf + 3, 1, size - 3, stderr);
}
return;
@@ -243,33 +243,12 @@ public:
}
private:
static void init_uv_threadpool()
{
#ifdef _MSC_VER
#define putenv _putenv
#endif
const uint32_t N = std::min(std::max(std::thread::hardware_concurrency(), 4U), 8U);
static char buf[40] = {};
log::Stream s(buf);
s << "UV_THREADPOOL_SIZE=" << N << '\0';
int err = putenv(buf);
if (err != 0) {
err = errno;
fprintf(stderr, "Couldn't set UV thread pool size to %u threads, putenv returned error %d\n", N, err);
}
static uv_work_t dummy;
err = uv_queue_work(uv_default_loop_checked(), &dummy, [](uv_work_t*) {}, nullptr);
if (err) {
fprintf(stderr, "init_uv_threadpool: uv_queue_work failed, error %s\n", uv_err_name(err));
}
}
bool reopen(struct stat& st)
{
if (!m_logFileEnabled) {
return true;
}
st = {};
if (m_logFile.is_open()) {
@@ -290,7 +269,6 @@ private:
return true;
}
private:
static void run_wrapper(void* arg) { reinterpret_cast<Worker*>(arg)->run(); }
NOINLINE void run()
@@ -299,7 +277,7 @@ private:
struct stat log_file_st;
if (!reopen(log_file_st)) {
if (!reopen(log_file_st) && m_consoleLogEnabled) {
fprintf(stderr, "failed to open %s: error %d\n", m_logFilePath.c_str(), errno);
}
@@ -354,9 +332,11 @@ private:
strip_colors(p, size);
}
fwrite(p, 1, size, (severity == 1) ? stdout : stderr);
if (m_consoleLogEnabled) {
fwrite(p, 1, size, (severity == 1) ? stdout : stderr);
}
if (m_logFile.is_open()) {
if (m_logFileEnabled && m_logFile.is_open()) {
if (c) {
strip_colors(p, size);
}
@@ -378,12 +358,12 @@ private:
// Mark this log slot empty
severity_ptr->store('\0', std::memory_order_relaxed);
m_readPos.fetch_add(SLOT_SIZE, std::memory_order_relaxed);
} while (m_readPos.load(std::memory_order_relaxed) != writePos);
// fetch_add returns the pre-increment value; "+ SLOT_SIZE" gives us the new m_readPos
} while (m_readPos.fetch_add(SLOT_SIZE, std::memory_order_relaxed) + SLOT_SIZE != writePos);
}
// Flush the log file only after all pending log lines have been written
if (m_logFile.is_open()) {
if (m_logFileEnabled && m_logFile.is_open()) {
m_logFile.flush();
// Automatically reopen the file if either it
@@ -455,6 +435,8 @@ private:
std::ofstream m_logFile;
std::string m_logFilePath;
bool m_consoleLogEnabled;
bool m_logFileEnabled;
uint64_t m_logFileLastStatTime;
std::atomic<bool> m_workerWaiting;
@@ -510,9 +492,6 @@ NOINLINE Writer::~Writer()
if (worker) {
worker->write(m_buf, size);
}
else {
fwrite(m_buf + 3, 1, size - 3, (m_buf[0] == 1) ? stdout : stderr);
}
#endif
}
+15 -3
View File
@@ -72,6 +72,9 @@ void p2pool_usage()
"--loglevel Verbosity of the log, integer number between 0 and %d\n"
"--data-dir Path to store general p2pool files (log, cache, peer data, etc.), default is current directory\n"
"--log-file Path to the log file, default is \"p2pool.log\" in p2pool's working directory\n"
"--no-console-log Disable logging to the console\n"
"--no-log-file Disable logging to the file\n"
"--disable-log Equivalent to --no-console-log --no-log-file, disables logging entirely and saves ~8 MB of memory\n"
"--sidechain-config Name of the p2pool sidechain parameters file (only use it if you run your own sidechain)\n"
"--data-api Path to the p2pool JSON data (use it in tandem with an external web-server). Not affected by --data-dir setting!\n"
"--local-api Enable /local/ path in api path for Stratum Server and built-in miner statistics\n"
@@ -311,6 +314,8 @@ int main(int argc, char* argv[])
return 1;
}
p2pool::set_main_thread();
#if defined(_WIN32) && defined(_MSC_VER) && !defined(NDEBUG)
SymInitialize(GetCurrentProcess(), NULL, TRUE);
#endif
@@ -325,7 +330,7 @@ int main(int argc, char* argv[])
// Create the default libuv loop and initialize libuv here
// It will call the important stuff like WSAStartup and many other things
// Some P2Pool code will not work without libuv initialized, so the code above this line must be minimal
uv_default_loop();
p2pool::init_uv();
const p2pool::Params params = params_file.empty() ? get_params(argc, argv) : get_params(params_file);
@@ -337,7 +342,12 @@ int main(int argc, char* argv[])
std::filesystem::create_directories(params.m_dataDir, err);
}
p2pool::log::start(params);
if (params.m_consoleLogEnabled || params.m_logFileEnabled) {
p2pool::log::start(params);
}
else {
p2pool::log::GLOBAL_LOG_LEVEL = -1;
}
p2pool::init_crypto_cache();
@@ -381,7 +391,9 @@ int main(int argc, char* argv[])
p2pool::indexed_hash::cleanup_storage();
#endif
p2pool::log::stop();
if (params.m_consoleLogEnabled || params.m_logFileEnabled) {
p2pool::log::stop();
}
uv_loop_close(uv_default_loop());
+16
View File
@@ -304,6 +304,22 @@ bool Params::process_arg(const std::vector<std::string>& arg)
return true;
}
if ((arg[0] == "no-console-log")) {
m_consoleLogEnabled = false;
return true;
}
if ((arg[0] == "no-log-file")) {
m_logFileEnabled = false;
return true;
}
if ((arg[0] == "disable-log")) {
m_consoleLogEnabled = false;
m_logFileEnabled = false;
return true;
}
if ((arg[0] == "sidechain-config") && has1(arg)) {
m_sidechainConfig = arg[1];
return true;
+2
View File
@@ -92,6 +92,8 @@ struct Params
std::string m_p2pPeerList;
std::string m_dataDir;
std::string m_logFilePath;
bool m_consoleLogEnabled = true;
bool m_logFileEnabled = true;
std::string m_sidechainConfig;
std::string m_apiPath;
uint64_t m_stratumBanTime = DEFAULT_STRATUM_BAN_TIME;
+28
View File
@@ -950,6 +950,34 @@ void set_thread_name(const char* name)
#endif
}
void init_uv()
{
// Creates the default loop if it doesn't exist yet
uv_default_loop();
#ifdef _MSC_VER
#define putenv _putenv
#endif
const uint32_t N = std::min(std::max(std::thread::hardware_concurrency(), 4U), 8U);
static char buf[40] = {};
log::Stream s(buf);
s << "UV_THREADPOOL_SIZE=" << N << '\0';
int err = putenv(buf);
if (err != 0) {
err = errno;
fprintf(stderr, "Couldn't set UV thread pool size to %u threads, putenv returned error %d\n", N, err);
}
static uv_work_t dummy;
err = uv_queue_work(uv_default_loop_checked(), &dummy, [](uv_work_t*) {}, nullptr);
if (err) {
fprintf(stderr, "init_uv_threadpool: uv_queue_work failed, error %s\n", uv_err_name(err));
}
}
std::string to_onion_v3(const hash& pubkey)
{
static constexpr uint8_t prefix[] = ".onion checksum";
+1
View File
@@ -233,5 +233,6 @@ void parallel_run(uv_loop_t* loop, T&& callback, bool wait = false)
}
void set_thread_name(const char* name);
void init_uv();
} // namespace p2pool