diff --git a/src/ipc/capnp/protocol.cpp b/src/ipc/capnp/protocol.cpp index 4150f9f4664..27ef73e84e5 100644 --- a/src/ipc/capnp/protocol.cpp +++ b/src/ipc/capnp/protocol.cpp @@ -30,10 +30,36 @@ namespace ipc { namespace capnp { namespace { -void IpcLogFn(bool raise, std::string message) + +BCLog::Level ConvertIPCLogLevel(mp::Log level) { - LogDebug(BCLog::IPC, "%s\n", message); - if (raise) throw Exception(message); + switch (level) { + case mp::Log::Trace: return BCLog::Level::Trace; + case mp::Log::Debug: return BCLog::Level::Debug; + case mp::Log::Info: return BCLog::Level::Info; + case mp::Log::Warning: return BCLog::Level::Warning; + case mp::Log::Error: return BCLog::Level::Error; + case mp::Log::Raise: return BCLog::Level::Error; + } // no default case, so the compiler can warn about missing cases + + // Be conservative and assume that if MP ever adds a new log level, it + // should only be shown at our most verbose level. + return BCLog::Level::Trace; +} + +mp::Log GetRequestedIPCLogLevel() +{ + if (LogAcceptCategory(BCLog::IPC, BCLog::Level::Trace)) return mp::Log::Trace; + if (LogAcceptCategory(BCLog::IPC, BCLog::Level::Debug)) return mp::Log::Debug; + + // Info, Warning, and Error are logged unconditionally + return mp::Log::Info; +} + +void IpcLogFn(mp::LogMessage message) +{ + LogPrintLevel(BCLog::IPC, ConvertIPCLogLevel(message.level), "%s\n", message.message); + if (message.level == mp::Log::Raise) throw Exception(message.message); } class CapnpProtocol : public Protocol @@ -62,7 +88,11 @@ public: { assert(!m_loop); mp::g_thread_context.thread_name = mp::ThreadName(exe_name); - m_loop.emplace(exe_name, &IpcLogFn, &m_context); + mp::LogOptions opts = { + .log_fn = IpcLogFn, + .log_level = GetRequestedIPCLogLevel() + }; + m_loop.emplace(exe_name, std::move(opts), &m_context); if (ready_fn) ready_fn(); mp::ServeStream(*m_loop, fd, init); m_parent_connection = &m_loop->m_incoming_connections.back(); @@ -90,7 +120,11 @@ public: std::promise promise; m_loop_thread = std::thread([&] { util::ThreadRename("capnp-loop"); - m_loop.emplace(exe_name, &IpcLogFn, &m_context); + mp::LogOptions opts = { + .log_fn = IpcLogFn, + .log_level = GetRequestedIPCLogLevel() + }; + m_loop.emplace(exe_name, std::move(opts), &m_context); m_loop_ref.emplace(*m_loop); promise.set_value(); m_loop->loop();