libutil: disable direct access to logger verbosity

that way we can sync it with rust for nearly free.

Change-Id: Ib3f1e0335884e077a0293f4b13c5919297748522
This commit is contained in:
eldritch horrors
2026-06-28 13:01:45 +00:00
parent 91663cca2d
commit c5bcb9a312
20 changed files with 64 additions and 45 deletions
+1 -1
View File
@@ -362,7 +362,7 @@ static int main_build_remote(AsyncIoRoot & aio, std::string programName, Strings
if (argv.size() != 1) if (argv.size() != 1)
throw UsageError("called without required arguments"); throw UsageError("called without required arguments");
verbosity = (Verbosity) std::stoll(argv.front()); setVerbosity((Verbosity) std::stoll(argv.front()));
auto conn = aio.kj.lowLevelProvider->wrapUnixSocketFd(1); auto conn = aio.kj.lowLevelProvider->wrapUnixSocketFd(1);
capnp::TwoPartyServer srv(kj::heap<Instance>()); capnp::TwoPartyServer srv(kj::heap<Instance>());
+1 -1
View File
@@ -35,7 +35,7 @@ static int main_builtin_builder(AsyncIoRoot & aio, std::string programName, Stri
}; };
if (auto val = string2Int<int>(getArg("verbosity"))) { if (auto val = string2Int<int>(getArg("verbosity"))) {
verbosity = verbosityFromIntClamped(*val); setVerbosity(verbosityFromIntClamped(*val));
} else { } else {
throw Error("expected a verbosity argument"); throw Error("expected a verbosity argument");
} }
+1 -1
View File
@@ -948,7 +948,7 @@ opServe(std::shared_ptr<Store> store, AsyncIoRoot & aio, Strings opFlags, String
auto getBuildSettings = [&]() { auto getBuildSettings = [&]() {
// FIXME: changing options here doesn't work if we're // FIXME: changing options here doesn't work if we're
// building through the daemon. // building through the daemon.
verbosity = lvlError; setVerbosity(lvlError);
settings.keepLog.override(false); settings.keepLog.override(false);
settings.useSubstitutes.override(false); settings.useSubstitutes.override(false);
settings.maxSilentTime.override(readNum<unsigned>(in)); settings.maxSilentTime.override(readNum<unsigned>(in));
+3 -3
View File
@@ -16,21 +16,21 @@ MixCommonArgs::MixCommonArgs(const std::string & programName)
.shortName = 'v', .shortName = 'v',
.description = "Increase the logging verbosity level.", .description = "Increase the logging verbosity level.",
.category = loggingCategory, .category = loggingCategory,
.handler = {[]() { verbosity = verbosityFromIntClamped(int(verbosity) + 1); }}, .handler = {[]() { setVerbosity(verbosityFromIntClamped(int(getVerbosity()) + 1)); }},
}); });
addFlag({ addFlag({
.longName = "quiet", .longName = "quiet",
.description = "Decrease the logging verbosity level.", .description = "Decrease the logging verbosity level.",
.category = loggingCategory, .category = loggingCategory,
.handler = {[]() { verbosity = verbosityFromIntClamped(int(verbosity) - 1); }}, .handler = {[]() { setVerbosity(verbosityFromIntClamped(int(getVerbosity()) - 1)); }},
}); });
addFlag({ addFlag({
.longName = "debug", .longName = "debug",
.description = "Set the logging verbosity level to 'debug'.", .description = "Set the logging verbosity level to 'debug'.",
.category = loggingCategory, .category = loggingCategory,
.handler = {[]() { verbosity = lvlDebug; }}, .handler = {[]() { setVerbosity(lvlDebug); }},
}); });
addFlag({ addFlag({
+3 -2
View File
@@ -106,7 +106,7 @@ bool ProgressBar::isVerbose()
Logger::BufferState ProgressBar::log(Verbosity lvl, std::string_view s) Logger::BufferState ProgressBar::log(Verbosity lvl, std::string_view s)
{ {
if (lvl > verbosity) { if (lvl > getVerbosity()) {
return BufferState::HasSpace; return BufferState::HasSpace;
} }
auto state(state_.lock()); auto state(state_.lock());
@@ -142,8 +142,9 @@ Logger::BufferState ProgressBar::startActivityImpl(
{ {
auto state(state_.lock()); auto state(state_.lock());
if (lvl <= verbosity && !s.empty() && type != actBuildWaiting) if (lvl <= getVerbosity() && !s.empty() && type != actBuildWaiting) {
(void) log(*state, lvl, s + "..."); (void) log(*state, lvl, s + "...");
}
state->activities.emplace_back(ActInfo { state->activities.emplace_back(ActInfo {
.s = s, .s = s,
+1 -1
View File
@@ -75,7 +75,7 @@ try {
auto buildHook = canonPath(buildHookArgs.front()); auto buildHook = canonPath(buildHookArgs.front());
buildHookArgs.emplace(std::next(buildHookArgs.begin()), baseNameOf(buildHook)); buildHookArgs.emplace(std::next(buildHookArgs.begin()), baseNameOf(buildHook));
buildHookArgs.push_back(std::to_string(verbosity)); buildHookArgs.push_back(std::to_string(getVerbosity()));
/* Create the communication pipes. */ /* Create the communication pipes. */
auto [selfRPC, hookRPC] = SocketPair::stream(); auto [selfRPC, hookRPC] = SocketPair::stream();
+2 -2
View File
@@ -897,7 +897,7 @@ try {
if (drv->isBuiltin()) { if (drv->isBuiltin()) {
args.push_back("builtin-builder"); args.push_back("builtin-builder");
args.push_back(std::to_string(verbosity)); args.push_back(std::to_string(getVerbosity()));
std::map<std::string, AbstractConfig::SettingInfo> changedSettings; std::map<std::string, AbstractConfig::SettingInfo> changedSettings;
globalConfig.getChangedSettings(changedSettings); globalConfig.getChangedSettings(changedSettings);
@@ -984,7 +984,7 @@ try {
auto groups = buildUser->getSupplementaryGIDs(); auto groups = buildUser->getSupplementaryGIDs();
creds.setSupplementaryGroups({groups.data(), groups.size()}); creds.setSupplementaryGroups({groups.data(), groups.size()});
} }
request.setDebug(verbosity >= lvlDebug); request.setDebug(getVerbosity() >= lvlDebug);
fillBuilderConfig(request); fillBuilderConfig(request);
+3 -3
View File
@@ -95,7 +95,7 @@ struct TunnelLogger : public Logger
BufferState log(Verbosity lvl, std::string_view s) override BufferState log(Verbosity lvl, std::string_view s) override
{ {
if (lvl > verbosity) { if (lvl > getVerbosity()) {
return BufferState::HasSpace; return BufferState::HasSpace;
} }
@@ -106,7 +106,7 @@ struct TunnelLogger : public Logger
BufferState logEI(const ErrorInfo & ei) override BufferState logEI(const ErrorInfo & ei) override
{ {
if (ei.level > verbosity) { if (ei.level > getVerbosity()) {
return BufferState::HasSpace; return BufferState::HasSpace;
} }
@@ -195,7 +195,7 @@ struct ClientSettings
settings.keepFailed.override(keepFailed); settings.keepFailed.override(keepFailed);
settings.keepGoing.override(keepGoing); settings.keepGoing.override(keepGoing);
settings.tryFallback.override(tryFallback); settings.tryFallback.override(tryFallback);
nix::verbosity = verbosity; setVerbosity(verbosity);
settings.maxBuildJobs.override(maxBuildJobs); settings.maxBuildJobs.override(maxBuildJobs);
settings.maxSilentTime.override(maxSilentTime); settings.maxSilentTime.override(maxSilentTime);
settings.verboseBuild = verboseBuild; settings.verboseBuild = verboseBuild;
+1 -1
View File
@@ -177,7 +177,7 @@ struct TransferItem
} }
} }
if (verbosity >= lvlVomit) { if (getVerbosity() >= lvlVomit) {
curl_easy_setopt(req.get(), CURLOPT_VERBOSE, 1); curl_easy_setopt(req.get(), CURLOPT_VERBOSE, 1);
curl_easy_setopt(req.get(), CURLOPT_DEBUGFUNCTION, TransferItem::debugCallback); curl_easy_setopt(req.get(), CURLOPT_DEBUGFUNCTION, TransferItem::debugCallback);
} }
+3 -1
View File
@@ -127,11 +127,12 @@ kj::Promise<Result<void>> RemoteStore::setOptions(Connection & conn)
try { try {
StringSink command; StringSink command;
// clang-format off
command << WorkerProto::Op::SetOptions command << WorkerProto::Op::SetOptions
<< settings.keepFailed << settings.keepFailed
<< settings.keepGoing << settings.keepGoing
<< settings.tryFallback << settings.tryFallback
<< verbosity << getVerbosity()
<< settings.maxBuildJobs << settings.maxBuildJobs
<< settings.maxSilentTime << settings.maxSilentTime
<< true << true
@@ -140,6 +141,7 @@ try {
<< 0 /* obsolete print build trace */ << 0 /* obsolete print build trace */
<< settings.buildCores << settings.buildCores
<< settings.useSubstitutes; << settings.useSubstitutes;
// clang-format on
std::map<std::string, Config::SettingInfo> overrides; std::map<std::string, Config::SettingInfo> overrides;
settings.getSettings(overrides, true); // libstore settings settings.getSettings(overrides, true); // libstore settings
+6 -4
View File
@@ -97,7 +97,10 @@ class AwsLogger : public Aws::Utils::Logging::FormattedLogSystem
void ProcessFormattedStatement(Aws::String && statement) override void ProcessFormattedStatement(Aws::String && statement) override
{ {
// FIXME: workaround for truly excessive log spam in debug level: https://github.com/aws/aws-sdk-cpp/pull/3003 // FIXME: workaround for truly excessive log spam in debug level: https://github.com/aws/aws-sdk-cpp/pull/3003
if ((statement.find("(SSLDataIn)") != std::string::npos || statement.find("(SSLDataOut)") != std::string::npos) && verbosity <= lvlDebug) { if ((statement.find("(SSLDataIn)") != std::string::npos
|| statement.find("(SSLDataOut)") != std::string::npos)
&& getVerbosity() <= lvlDebug)
{
return; return;
} }
debug("AWS: %s", chomp(statement)); debug("AWS: %s", chomp(statement));
@@ -116,9 +119,8 @@ static void initAWS()
shared.cc), so don't let aws-sdk-cpp override it. */ shared.cc), so don't let aws-sdk-cpp override it. */
options.cryptoOptions.initAndCleanupOpenSSL = false; options.cryptoOptions.initAndCleanupOpenSSL = false;
if (verbosity >= lvlDebug) { if (getVerbosity() >= lvlDebug) {
options.loggingOptions.logLevel = options.loggingOptions.logLevel = getVerbosity() == lvlDebug
verbosity == lvlDebug
? Aws::Utils::Logging::LogLevel::Debug ? Aws::Utils::Logging::LogLevel::Debug
: Aws::Utils::Logging::LogLevel::Trace; : Aws::Utils::Logging::LogLevel::Trace;
options.loggingOptions.logger_create_fn = [options]() { options.loggingOptions.logger_create_fn = [options]() {
+1 -1
View File
@@ -100,7 +100,7 @@ void RootArgs::parseCmdline(const Strings & _cmdline)
throw UsageError("Invalid word number to get completion for: %zu\n. Your autocompletions might be misconfigured", n); throw UsageError("Invalid word number to get completion for: %zu\n. Your autocompletions might be misconfigured", n);
*std::next(cmdline.begin(), n - 1) += completionMarker; *std::next(cmdline.begin(), n - 1) += completionMarker;
completions = std::make_shared<Completions>(); completions = std::make_shared<Completions>();
verbosity = lvlError; setVerbosity(lvlError);
} }
for (auto pos = cmdline.begin(); pos != cmdline.end(); ) { for (auto pos = cmdline.begin(); pos != cmdline.end(); ) {
+8 -3
View File
@@ -76,7 +76,7 @@ public:
BufferState log(Verbosity lvl, std::string_view s) override BufferState log(Verbosity lvl, std::string_view s) override
{ {
if (lvl > verbosity) { if (lvl > getVerbosity()) {
return BufferState::HasSpace; return BufferState::HasSpace;
} }
@@ -116,7 +116,7 @@ public:
ActivityId parent ActivityId parent
) override ) override
{ {
if (lvl <= verbosity && !s.empty()) { if (lvl <= getVerbosity() && !s.empty()) {
return log(lvl, s + "..."); return log(lvl, s + "...");
} }
return BufferState::HasSpace; return BufferState::HasSpace;
@@ -136,7 +136,12 @@ public:
} }
}; };
Verbosity verbosity = lvlInfo; Verbosity detail::verbosity = lvlInfo;
void setVerbosity(Verbosity v)
{
detail::verbosity = v;
}
Verbosity verbosityFromIntClamped(int val) Verbosity verbosityFromIntClamped(int val)
{ {
+18 -10
View File
@@ -319,10 +319,19 @@ Logger * makeSimpleLogger(bool printBuildLogs = true);
Logger * makeJSONLogger(Logger & prevLogger); Logger * makeJSONLogger(Logger & prevLogger);
namespace detail {
extern Verbosity verbosity;
}
inline Verbosity getVerbosity()
{
return detail::verbosity;
}
/** /**
* suppress msgs > this * suppress msgs > this
*/ */
extern Verbosity verbosity; void setVerbosity(Verbosity v);
extern LoggerSettings loggerSettings; extern LoggerSettings loggerSettings;
@@ -388,7 +397,7 @@ extern LoggerSettings loggerSettings;
*/ */
#define logErrorInfo(level, errorInfo...) \ #define logErrorInfo(level, errorInfo...) \
do { \ do { \
if ((level) <= ::nix::verbosity) { \ if ((level) <= ::nix::detail::verbosity) { \
(void) ::nix::logger->logEI((level), errorInfo); \ (void) ::nix::logger->logEI((level), errorInfo); \
} \ } \
} while (0) } while (0)
@@ -401,14 +410,13 @@ extern LoggerSettings loggerSettings;
* level. Note that this has to be implemented as a macro to ensure that the * level. Note that this has to be implemented as a macro to ensure that the
* arguments are evaluated lazily. The format string *must* be a literal. * arguments are evaluated lazily. The format string *must* be a literal.
*/ */
#define printMsgUsing(loggerParam, level, fs, args...) \ #define printMsgUsing(loggerParam, level, fs, args...) \
do { \ do { \
auto _lix_logger_print_lvl = level; \ auto _lix_logger_print_lvl = level; \
const char * _lix_format = []<size_t N>(const char(&_lix_fs)[N]) { return _lix_fs; }(fs); \ const char * _lix_format = []<size_t N>(const char (&_lix_fs)[N]) { return _lix_fs; }(fs); \
if (_lix_logger_print_lvl <= ::nix::verbosity) { \ if (_lix_logger_print_lvl <= ::nix::detail::verbosity) { \
(void \ (void) loggerParam->log(_lix_logger_print_lvl, ::nix::HintFmt(_lix_format, ##args).str()); \
) loggerParam->log(_lix_logger_print_lvl, ::nix::HintFmt(_lix_format, ##args).str()); \ } \
} \
} while (0) } while (0)
#define printMsg(level, fs, args...) printMsgUsing(::nix::logger, level, fs, ##args) #define printMsg(level, fs, args...) printMsgUsing(::nix::logger, level, fs, ##args)
+2 -2
View File
@@ -393,7 +393,7 @@ try {
"--for", "--for",
peer.pid ? fmt("%1%", *peer.pid) : "unknown", peer.pid ? fmt("%1%", *peer.pid) : "unknown",
"--log-level", "--log-level",
fmt("%1%", int(verbosity)), fmt("%1%", int(getVerbosity())),
"--protocol", "--protocol",
std::string(socket.id()), std::string(socket.id()),
}, },
@@ -687,7 +687,7 @@ main_nix_daemon(AsyncIoRoot & aio, std::string programName, Strings argv, std::s
}).parseCmdline(argv); }).parseCmdline(argv);
if (isInstance) { if (isInstance) {
verbosity = Verbosity(std::min<uint64_t>(subdaemonLogLevel, lvlVomit)); setVerbosity(Verbosity(std::min<uint64_t>(subdaemonLogLevel, lvlVomit)));
daemonInstance(daemon::getProtocol(protocol), aio, isTrustedOpt, peerPidArg); daemonInstance(daemon::getProtocol(protocol), aio, isTrustedOpt, peerPidArg);
} else { } else {
runDaemon(aio, stdio, isTrustedOpt); runDaemon(aio, stdio, isTrustedOpt);
+2 -1
View File
@@ -599,8 +599,9 @@ struct CmdDevelop : Common, MixEnvironment
auto script = makeRcScript(*state, store, buildEnvironment, (Path) tmpDir); auto script = makeRcScript(*state, store, buildEnvironment, (Path) tmpDir);
if (verbosity >= lvlDebug) if (getVerbosity() >= lvlDebug) {
script += "set -x\n"; script += "set -x\n";
}
script += fmt("command rm -f '%s'\n", rcFilePath); script += fmt("command rm -f '%s'\n", rcFilePath);
+2 -2
View File
@@ -505,9 +505,9 @@ int mainWrapped(AsyncIoRoot & aio, int argc, char ** argv)
// FIXME: stop messing about with log verbosity depending on if it is interactive use // FIXME: stop messing about with log verbosity depending on if it is interactive use
if (isatty(STDERR_FILENO)) { if (isatty(STDERR_FILENO)) {
verbosity = lvlNotice; setVerbosity(lvlNotice);
} else { } else {
verbosity = lvlInfo; setVerbosity(lvlInfo);
} }
registerCommands(); registerCommands();
+1 -1
View File
@@ -78,7 +78,7 @@ void init()
void setVerbosity(int level) void setVerbosity(int level)
CODE: CODE:
verbosity = (Verbosity) level; setVerbosity((Verbosity) level);
int isValidPath(char * path) int isValidPath(char * path)
+1 -1
View File
@@ -445,7 +445,7 @@ TEST(FileTransfer, DISABLED_interrupt)
} }
}; };
verbosity = lvlDebug; setVerbosity(lvlDebug);
logger = new InterruptingLogger; logger = new InterruptingLogger;
AsyncIoRoot aio; AsyncIoRoot aio;
+4 -4
View File
@@ -102,7 +102,7 @@ namespace nix {
} }
TEST(logEI, loggingErrorOnTalkativeLevel) { TEST(logEI, loggingErrorOnTalkativeLevel) {
verbosity = lvlTalkative; setVerbosity(lvlTalkative);
testing::internal::CaptureStderr(); testing::internal::CaptureStderr();
@@ -115,7 +115,7 @@ namespace nix {
} }
TEST(logEI, loggingErrorOnChattyLevel) { TEST(logEI, loggingErrorOnChattyLevel) {
verbosity = lvlChatty; setVerbosity(lvlChatty);
testing::internal::CaptureStderr(); testing::internal::CaptureStderr();
@@ -128,7 +128,7 @@ namespace nix {
} }
TEST(logEI, loggingErrorOnDebugLevel) { TEST(logEI, loggingErrorOnDebugLevel) {
verbosity = lvlDebug; setVerbosity(lvlDebug);
testing::internal::CaptureStderr(); testing::internal::CaptureStderr();
@@ -141,7 +141,7 @@ namespace nix {
} }
TEST(logEI, loggingErrorOnVomitLevel) { TEST(logEI, loggingErrorOnVomitLevel) {
verbosity = lvlVomit; setVerbosity(lvlVomit);
testing::internal::CaptureStderr(); testing::internal::CaptureStderr();