Skip to content

Commit bc66a9b

Browse files
committed
JSONLogger: Log to a file descriptor instead of another Logger
Logging to another Logger was kind of nonsensical - it was really just an easy way to get it to write its output to stderr, but that only works if the underlying logger writes to stderr. This change is needed to make it easy to log JSON output somewhere else (like a file or socket).
1 parent ca2e526 commit bc66a9b

File tree

5 files changed

+10
-9
lines changed

5 files changed

+10
-9
lines changed

src/build-remote/build-remote.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ static bool allSupportedLocally(Store & store, const std::set<std::string>& requ
5151
static int main_build_remote(int argc, char * * argv)
5252
{
5353
{
54-
logger = makeJSONLogger(*logger);
54+
logger = makeJSONLogger(STDERR_FILENO);
5555

5656
/* Ensure we don't get any SSH passphrase or host key popups. */
5757
unsetenv("DISPLAY");

src/libmain/loggers.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Logger * makeDefaultLogger() {
2727
case LogFormat::rawWithLogs:
2828
return makeSimpleLogger(true);
2929
case LogFormat::internalJSON:
30-
return makeJSONLogger(*makeSimpleLogger(true));
30+
return makeJSONLogger(STDERR_FILENO);
3131
case LogFormat::bar:
3232
return makeProgressBar();
3333
case LogFormat::barWithLogs: {

src/libstore/unix/build/local-derivation-goal.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2225,7 +2225,7 @@ void LocalDerivationGoal::runChild()
22252225
/* Execute the program. This should not return. */
22262226
if (drv->isBuiltin()) {
22272227
try {
2228-
logger = makeJSONLogger(*logger);
2228+
logger = makeJSONLogger(STDERR_FILENO);
22292229

22302230
std::map<std::string, Path> outputs;
22312231
for (auto & e : drv->outputs)

src/libutil/logging.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,9 @@ void to_json(nlohmann::json & json, std::shared_ptr<Pos> pos)
167167
}
168168

169169
struct JSONLogger : Logger {
170-
Logger & prevLogger;
170+
Descriptor fd;
171171

172-
JSONLogger(Logger & prevLogger) : prevLogger(prevLogger) { }
172+
JSONLogger(Descriptor fd) : fd(fd) { }
173173

174174
bool isVerbose() override {
175175
return true;
@@ -190,7 +190,7 @@ struct JSONLogger : Logger {
190190

191191
void write(const nlohmann::json & json)
192192
{
193-
prevLogger.log(lvlError, "@nix " + json.dump(-1, ' ', false, nlohmann::json::error_handler_t::replace));
193+
writeLine(fd, "@nix " + json.dump(-1, ' ', false, nlohmann::json::error_handler_t::replace));
194194
}
195195

196196
void log(Verbosity lvl, std::string_view s) override
@@ -262,9 +262,9 @@ struct JSONLogger : Logger {
262262
}
263263
};
264264

265-
Logger * makeJSONLogger(Logger & prevLogger)
265+
Logger * makeJSONLogger(Descriptor fd)
266266
{
267-
return new JSONLogger(prevLogger);
267+
return new JSONLogger(fd);
268268
}
269269

270270
static Logger::Fields getFields(nlohmann::json & json)

src/libutil/logging.hh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "error.hh"
55
#include "config.hh"
6+
#include "file-descriptor.hh"
67

78
#include <nlohmann/json_fwd.hpp>
89

@@ -183,7 +184,7 @@ extern Logger * logger;
183184

184185
Logger * makeSimpleLogger(bool printBuildLogs = true);
185186

186-
Logger * makeJSONLogger(Logger & prevLogger);
187+
Logger * makeJSONLogger(Descriptor fd);
187188

188189
/**
189190
* @param source A noun phrase describing the source of the message, e.g. "the builder".

0 commit comments

Comments
 (0)