aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/eval.cc2
-rw-r--r--src/libmain/loggers.cc6
-rw-r--r--src/libmain/progress-bar.cc10
-rw-r--r--src/libmain/shared.cc3
-rw-r--r--src/libstore/daemon.cc10
-rw-r--r--src/libstore/globals.hh4
-rw-r--r--src/libstore/remote-store.cc3
-rw-r--r--src/libutil/logging.cc34
-rw-r--r--src/libutil/logging.hh16
-rw-r--r--src/libutil/tests/logging.cc4
10 files changed, 35 insertions, 57 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index e89948b94..c1a9af9b2 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -1232,7 +1232,7 @@ void EvalState::callFunction(Value & fun, Value & arg, Value & v, const Pos & po
/* Evaluate the body. This is conditional on showTrace, because
catching exceptions makes this function not tail-recursive. */
- if (settings.showTrace)
+ if (loggerSettings.showTrace.get())
try {
lambda.body->eval(*this, env2, v);
} catch (Error & e) {
diff --git a/src/libmain/loggers.cc b/src/libmain/loggers.cc
index fd6ce912f..fa18f991d 100644
--- a/src/libmain/loggers.cc
+++ b/src/libmain/loggers.cc
@@ -22,11 +22,11 @@ LogFormat parseLogFormat(const std::string & logFormatStr) {
Logger * makeDefaultLogger() {
switch (defaultLogFormat) {
case LogFormat::raw:
- return makeSimpleLogger(false, false);
+ return makeSimpleLogger(false);
case LogFormat::rawWithLogs:
- return makeSimpleLogger(true, false);
+ return makeSimpleLogger(true);
case LogFormat::internalJson:
- return makeJSONLogger(*makeSimpleLogger(true, false));
+ return makeJSONLogger(*makeSimpleLogger(true));
case LogFormat::bar:
return makeProgressBar();
case LogFormat::barWithLogs:
diff --git a/src/libmain/progress-bar.cc b/src/libmain/progress-bar.cc
index 265b16908..3f7d99a1d 100644
--- a/src/libmain/progress-bar.cc
+++ b/src/libmain/progress-bar.cc
@@ -81,14 +81,12 @@ private:
bool printBuildLogs;
bool isTTY;
- bool showTrace;
public:
ProgressBar(bool printBuildLogs, bool isTTY)
: printBuildLogs(printBuildLogs)
, isTTY(isTTY)
- , showTrace(false)
{
state_.lock()->active = isTTY;
updateThread = std::thread([&]() {
@@ -133,16 +131,10 @@ public:
auto state(state_.lock());
std::stringstream oss;
- showErrorInfo(oss, ei, showTrace);
+ showErrorInfo(oss, ei, loggerSettings.showTrace.get());
log(*state, ei.level, oss.str());
}
- bool getShowTrace() const override {
- return showTrace;
- }
- void setShowTrace(bool showTrace) override {
- this->showTrace = showTrace;
- }
void log(State & state, Verbosity lvl, const std::string & s)
{
diff --git a/src/libmain/shared.cc b/src/libmain/shared.cc
index 5cbdd19e5..52718c231 100644
--- a/src/libmain/shared.cc
+++ b/src/libmain/shared.cc
@@ -323,9 +323,8 @@ int handleExceptions(const string & programName, std::function<void()> fun)
printError("Try '%1% --help' for more information.", programName);
return 1;
} catch (BaseError & e) {
- logger->setShowTrace(settings.showTrace);
logError(e.info());
- if (e.hasTrace() && !settings.showTrace)
+ if (e.hasTrace() && !loggerSettings.showTrace.get())
printError("(use '--show-trace' to show detailed location information)");
return e.status;
} catch (std::bad_alloc & e) {
diff --git a/src/libstore/daemon.cc b/src/libstore/daemon.cc
index 186ccc5b4..40d126192 100644
--- a/src/libstore/daemon.cc
+++ b/src/libstore/daemon.cc
@@ -41,10 +41,9 @@ struct TunnelLogger : public Logger
Sync<State> state_;
unsigned int clientVersion;
- bool showTrace;
TunnelLogger(FdSink & to, unsigned int clientVersion)
- : to(to), clientVersion(clientVersion), showTrace(false) { }
+ : to(to), clientVersion(clientVersion) { }
void enqueueMsg(const std::string & s)
{
@@ -86,13 +85,6 @@ struct TunnelLogger : public Logger
enqueueMsg(*buf.s);
}
- bool getShowTrace() const override {
- return showTrace;
- }
- void setShowTrace(bool showTrace) override {
- this->showTrace = showTrace;
- }
-
/* startWork() means that we're starting an operation for which we
want to send out stderr to the client. */
void startWork()
diff --git a/src/libstore/globals.hh b/src/libstore/globals.hh
index 2fbcafff8..58cf08763 100644
--- a/src/libstore/globals.hh
+++ b/src/libstore/globals.hh
@@ -196,10 +196,6 @@ public:
/* Whether to lock the Nix client and worker to the same CPU. */
bool lockCPU;
- /* Whether to show a stack trace if Nix evaluation fails. */
- Setting<bool> showTrace{this, false, "show-trace",
- "Whether to show a stack trace on evaluation errors."};
-
Setting<SandboxMode> sandboxMode{this,
#if __linux__
smEnabled
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index b7cc7a5fc..670a6d873 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -8,6 +8,7 @@
#include "derivations.hh"
#include "pool.hh"
#include "finally.hh"
+#include "logging.hh"
#include <sys/types.h>
#include <sys/stat.h>
@@ -197,7 +198,7 @@ void RemoteStore::setOptions(Connection & conn)
overrides.erase(settings.maxSilentTime.name);
overrides.erase(settings.buildCores.name);
overrides.erase(settings.useSubstitutes.name);
- overrides.erase(settings.showTrace.name);
+ overrides.erase(loggerSettings.showTrace.name);
conn.to << overrides.size();
for (auto & i : overrides)
conn.to << i.first << i.second.value;
diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc
index 7a58527b8..90c6afe81 100644
--- a/src/libutil/logging.cc
+++ b/src/libutil/logging.cc
@@ -1,5 +1,6 @@
#include "logging.hh"
#include "util.hh"
+#include "config.hh"
#include <atomic>
#include <nlohmann/json.hpp>
@@ -7,6 +8,10 @@
namespace nix {
+LoggerSettings loggerSettings;
+
+static GlobalConfig::Register r1(&loggerSettings);
+
static thread_local ActivityId curActivity = 0;
ActivityId getCurActivity()
@@ -18,7 +23,7 @@ void setCurActivity(const ActivityId activityId)
curActivity = activityId;
}
-Logger * logger = makeSimpleLogger(true, false);
+Logger * logger = makeSimpleLogger(true);
void Logger::warn(const std::string & msg)
{
@@ -36,10 +41,9 @@ public:
bool systemd, tty;
bool printBuildLogs;
- bool showTrace;
- SimpleLogger(bool printBuildLogs, bool showTrace)
- : printBuildLogs(printBuildLogs), showTrace(showTrace)
+ SimpleLogger(bool printBuildLogs)
+ : printBuildLogs(printBuildLogs)
{
systemd = getEnv("IN_SYSTEMD") == "1";
tty = isatty(STDERR_FILENO);
@@ -49,13 +53,6 @@ public:
return printBuildLogs;
}
- bool getShowTrace() const override {
- return showTrace;
- }
- void setShowTrace(bool showTrace) override {
- this->showTrace = showTrace;
- }
-
void log(Verbosity lvl, const FormatOrString & fs) override
{
if (lvl > verbosity) return;
@@ -80,7 +77,7 @@ public:
void logEI(const ErrorInfo & ei) override
{
std::stringstream oss;
- showErrorInfo(oss, ei, showTrace);
+ showErrorInfo(oss, ei, loggerSettings.showTrace.get());
log(ei.level, oss.str());
}
@@ -129,9 +126,9 @@ void writeToStderr(const string & s)
}
}
-Logger * makeSimpleLogger(bool printBuildLogs, bool showTrace)
+Logger * makeSimpleLogger(bool printBuildLogs)
{
- return new SimpleLogger(printBuildLogs, showTrace);
+ return new SimpleLogger(printBuildLogs);
}
std::atomic<uint64_t> nextId{(uint64_t) getpid() << 32};
@@ -152,13 +149,6 @@ struct JSONLogger : Logger {
return true;
}
- bool getShowTrace() const override {
- return prevLogger.getShowTrace();
- }
- void setShowTrace(bool showTrace) override {
- prevLogger.setShowTrace(showTrace);
- }
-
void addFields(nlohmann::json & json, const Fields & fields)
{
if (fields.empty()) return;
@@ -189,7 +179,7 @@ struct JSONLogger : Logger {
void logEI(const ErrorInfo & ei) override
{
std::ostringstream oss;
- showErrorInfo(oss, ei, getShowTrace());
+ showErrorInfo(oss, ei, loggerSettings.showTrace.get());
nlohmann::json json;
json["action"] = "msg";
diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh
index 273300b50..09619aac6 100644
--- a/src/libutil/logging.hh
+++ b/src/libutil/logging.hh
@@ -2,6 +2,7 @@
#include "types.hh"
#include "error.hh"
+#include "config.hh"
namespace nix {
@@ -34,6 +35,16 @@ typedef enum {
typedef uint64_t ActivityId;
+struct LoggerSettings : Config
+{
+ Setting<bool> showTrace{this,
+ false,
+ "show-trace",
+ "Whether to show a stack trace on evaluation errors."};
+};
+
+extern LoggerSettings loggerSettings;
+
class Logger
{
friend struct Activity;
@@ -75,9 +86,6 @@ public:
logEI(ei);
}
- virtual bool getShowTrace() const = 0;
- virtual void setShowTrace(bool showTrace) = 0;
-
virtual void warn(const std::string & msg);
virtual void startActivity(ActivityId act, Verbosity lvl, ActivityType type,
@@ -149,7 +157,7 @@ struct PushActivity
extern Logger * logger;
-Logger * makeSimpleLogger(bool printBuildLogs = true, bool showTrace = false);
+Logger * makeSimpleLogger(bool printBuildLogs = true);
Logger * makeJSONLogger(Logger & prevLogger);
diff --git a/src/libutil/tests/logging.cc b/src/libutil/tests/logging.cc
index f51e40fa8..ef22e9966 100644
--- a/src/libutil/tests/logging.cc
+++ b/src/libutil/tests/logging.cc
@@ -266,7 +266,7 @@ namespace nix {
testing::internal::CaptureStderr();
- logger->setShowTrace(true);
+ loggerSettings.showTrace.assign(true);
logError(e.info());
@@ -292,7 +292,7 @@ namespace nix {
testing::internal::CaptureStderr();
- logger->setShowTrace(false);
+ loggerSettings.showTrace.assign(false);
logError(e.info());