move showTrace to new loggerSettings

This commit is contained in:
Ben Burdette 2020-07-02 09:04:31 -06:00
parent 5ae498872a
commit bf2788e4c1
10 changed files with 35 additions and 57 deletions

View file

@ -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 /* Evaluate the body. This is conditional on showTrace, because
catching exceptions makes this function not tail-recursive. */ catching exceptions makes this function not tail-recursive. */
if (settings.showTrace) if (loggerSettings.showTrace.get())
try { try {
lambda.body->eval(*this, env2, v); lambda.body->eval(*this, env2, v);
} catch (Error & e) { } catch (Error & e) {

View file

@ -22,11 +22,11 @@ LogFormat parseLogFormat(const std::string & logFormatStr) {
Logger * makeDefaultLogger() { Logger * makeDefaultLogger() {
switch (defaultLogFormat) { switch (defaultLogFormat) {
case LogFormat::raw: case LogFormat::raw:
return makeSimpleLogger(false, false); return makeSimpleLogger(false);
case LogFormat::rawWithLogs: case LogFormat::rawWithLogs:
return makeSimpleLogger(true, false); return makeSimpleLogger(true);
case LogFormat::internalJson: case LogFormat::internalJson:
return makeJSONLogger(*makeSimpleLogger(true, false)); return makeJSONLogger(*makeSimpleLogger(true));
case LogFormat::bar: case LogFormat::bar:
return makeProgressBar(); return makeProgressBar();
case LogFormat::barWithLogs: case LogFormat::barWithLogs:

View file

@ -81,14 +81,12 @@ private:
bool printBuildLogs; bool printBuildLogs;
bool isTTY; bool isTTY;
bool showTrace;
public: public:
ProgressBar(bool printBuildLogs, bool isTTY) ProgressBar(bool printBuildLogs, bool isTTY)
: printBuildLogs(printBuildLogs) : printBuildLogs(printBuildLogs)
, isTTY(isTTY) , isTTY(isTTY)
, showTrace(false)
{ {
state_.lock()->active = isTTY; state_.lock()->active = isTTY;
updateThread = std::thread([&]() { updateThread = std::thread([&]() {
@ -133,16 +131,10 @@ public:
auto state(state_.lock()); auto state(state_.lock());
std::stringstream oss; std::stringstream oss;
showErrorInfo(oss, ei, showTrace); showErrorInfo(oss, ei, loggerSettings.showTrace.get());
log(*state, ei.level, oss.str()); 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) void log(State & state, Verbosity lvl, const std::string & s)
{ {

View file

@ -323,9 +323,8 @@ int handleExceptions(const string & programName, std::function<void()> fun)
printError("Try '%1% --help' for more information.", programName); printError("Try '%1% --help' for more information.", programName);
return 1; return 1;
} catch (BaseError & e) { } catch (BaseError & e) {
logger->setShowTrace(settings.showTrace);
logError(e.info()); logError(e.info());
if (e.hasTrace() && !settings.showTrace) if (e.hasTrace() && !loggerSettings.showTrace.get())
printError("(use '--show-trace' to show detailed location information)"); printError("(use '--show-trace' to show detailed location information)");
return e.status; return e.status;
} catch (std::bad_alloc & e) { } catch (std::bad_alloc & e) {

View file

@ -41,10 +41,9 @@ struct TunnelLogger : public Logger
Sync<State> state_; Sync<State> state_;
unsigned int clientVersion; unsigned int clientVersion;
bool showTrace;
TunnelLogger(FdSink & to, unsigned int clientVersion) TunnelLogger(FdSink & to, unsigned int clientVersion)
: to(to), clientVersion(clientVersion), showTrace(false) { } : to(to), clientVersion(clientVersion) { }
void enqueueMsg(const std::string & s) void enqueueMsg(const std::string & s)
{ {
@ -86,13 +85,6 @@ struct TunnelLogger : public Logger
enqueueMsg(*buf.s); 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 /* startWork() means that we're starting an operation for which we
want to send out stderr to the client. */ want to send out stderr to the client. */
void startWork() void startWork()

View file

@ -196,10 +196,6 @@ public:
/* Whether to lock the Nix client and worker to the same CPU. */ /* Whether to lock the Nix client and worker to the same CPU. */
bool lockCPU; 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, Setting<SandboxMode> sandboxMode{this,
#if __linux__ #if __linux__
smEnabled smEnabled

View file

@ -8,6 +8,7 @@
#include "derivations.hh" #include "derivations.hh"
#include "pool.hh" #include "pool.hh"
#include "finally.hh" #include "finally.hh"
#include "logging.hh"
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -197,7 +198,7 @@ void RemoteStore::setOptions(Connection & conn)
overrides.erase(settings.maxSilentTime.name); overrides.erase(settings.maxSilentTime.name);
overrides.erase(settings.buildCores.name); overrides.erase(settings.buildCores.name);
overrides.erase(settings.useSubstitutes.name); overrides.erase(settings.useSubstitutes.name);
overrides.erase(settings.showTrace.name); overrides.erase(loggerSettings.showTrace.name);
conn.to << overrides.size(); conn.to << overrides.size();
for (auto & i : overrides) for (auto & i : overrides)
conn.to << i.first << i.second.value; conn.to << i.first << i.second.value;

View file

@ -1,5 +1,6 @@
#include "logging.hh" #include "logging.hh"
#include "util.hh" #include "util.hh"
#include "config.hh"
#include <atomic> #include <atomic>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
@ -7,6 +8,10 @@
namespace nix { namespace nix {
LoggerSettings loggerSettings;
static GlobalConfig::Register r1(&loggerSettings);
static thread_local ActivityId curActivity = 0; static thread_local ActivityId curActivity = 0;
ActivityId getCurActivity() ActivityId getCurActivity()
@ -18,7 +23,7 @@ void setCurActivity(const ActivityId activityId)
curActivity = activityId; curActivity = activityId;
} }
Logger * logger = makeSimpleLogger(true, false); Logger * logger = makeSimpleLogger(true);
void Logger::warn(const std::string & msg) void Logger::warn(const std::string & msg)
{ {
@ -36,10 +41,9 @@ public:
bool systemd, tty; bool systemd, tty;
bool printBuildLogs; bool printBuildLogs;
bool showTrace;
SimpleLogger(bool printBuildLogs, bool showTrace) SimpleLogger(bool printBuildLogs)
: printBuildLogs(printBuildLogs), showTrace(showTrace) : printBuildLogs(printBuildLogs)
{ {
systemd = getEnv("IN_SYSTEMD") == "1"; systemd = getEnv("IN_SYSTEMD") == "1";
tty = isatty(STDERR_FILENO); tty = isatty(STDERR_FILENO);
@ -49,13 +53,6 @@ public:
return printBuildLogs; return printBuildLogs;
} }
bool getShowTrace() const override {
return showTrace;
}
void setShowTrace(bool showTrace) override {
this->showTrace = showTrace;
}
void log(Verbosity lvl, const FormatOrString & fs) override void log(Verbosity lvl, const FormatOrString & fs) override
{ {
if (lvl > verbosity) return; if (lvl > verbosity) return;
@ -80,7 +77,7 @@ public:
void logEI(const ErrorInfo & ei) override void logEI(const ErrorInfo & ei) override
{ {
std::stringstream oss; std::stringstream oss;
showErrorInfo(oss, ei, showTrace); showErrorInfo(oss, ei, loggerSettings.showTrace.get());
log(ei.level, oss.str()); 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}; std::atomic<uint64_t> nextId{(uint64_t) getpid() << 32};
@ -152,13 +149,6 @@ struct JSONLogger : Logger {
return true; 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) void addFields(nlohmann::json & json, const Fields & fields)
{ {
if (fields.empty()) return; if (fields.empty()) return;
@ -189,7 +179,7 @@ struct JSONLogger : Logger {
void logEI(const ErrorInfo & ei) override void logEI(const ErrorInfo & ei) override
{ {
std::ostringstream oss; std::ostringstream oss;
showErrorInfo(oss, ei, getShowTrace()); showErrorInfo(oss, ei, loggerSettings.showTrace.get());
nlohmann::json json; nlohmann::json json;
json["action"] = "msg"; json["action"] = "msg";

View file

@ -2,6 +2,7 @@
#include "types.hh" #include "types.hh"
#include "error.hh" #include "error.hh"
#include "config.hh"
namespace nix { namespace nix {
@ -34,6 +35,16 @@ typedef enum {
typedef uint64_t ActivityId; 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 class Logger
{ {
friend struct Activity; friend struct Activity;
@ -75,9 +86,6 @@ public:
logEI(ei); logEI(ei);
} }
virtual bool getShowTrace() const = 0;
virtual void setShowTrace(bool showTrace) = 0;
virtual void warn(const std::string & msg); virtual void warn(const std::string & msg);
virtual void startActivity(ActivityId act, Verbosity lvl, ActivityType type, virtual void startActivity(ActivityId act, Verbosity lvl, ActivityType type,
@ -149,7 +157,7 @@ struct PushActivity
extern Logger * logger; extern Logger * logger;
Logger * makeSimpleLogger(bool printBuildLogs = true, bool showTrace = false); Logger * makeSimpleLogger(bool printBuildLogs = true);
Logger * makeJSONLogger(Logger & prevLogger); Logger * makeJSONLogger(Logger & prevLogger);

View file

@ -266,7 +266,7 @@ namespace nix {
testing::internal::CaptureStderr(); testing::internal::CaptureStderr();
logger->setShowTrace(true); loggerSettings.showTrace.assign(true);
logError(e.info()); logError(e.info());
@ -292,7 +292,7 @@ namespace nix {
testing::internal::CaptureStderr(); testing::internal::CaptureStderr();
logger->setShowTrace(false); loggerSettings.showTrace.assign(false);
logError(e.info()); logError(e.info());