diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc index 16ff1c5f4..7884b6f29 100644 --- a/src/libutil/logging.cc +++ b/src/libutil/logging.cc @@ -344,15 +344,16 @@ std::unique_ptr makeJSONLogger(const std::filesystem::path & path, bool void applyJSONLogger() { if (!loggerSettings.jsonLogPath.get().empty()) { - std::vector> loggers; try { - loggers.push_back(std::move(logger)); + std::vector> loggers; loggers.push_back(makeJSONLogger(std::filesystem::path(loggerSettings.jsonLogPath.get()), false)); - logger = makeTeeLogger(std::move(loggers)); + // Note: this had better not throw, otherwise `logger` is + // left unset. + logger = makeTeeLogger(std::move(logger), std::move(loggers)); } catch (...) { - logger = std::move(loggers[0]); ignoreExceptionExceptInterrupt(); } + } } diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index 290a49bb8..07f49be19 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -215,7 +215,14 @@ extern std::unique_ptr logger; std::unique_ptr makeSimpleLogger(bool printBuildLogs = true); -std::unique_ptr makeTeeLogger(std::vector> && loggers); +/** + * Create a logger that sends log messages to `mainLogger` and the + * list of loggers in `extraLoggers`. Only `mainLogger` is used for + * writing to stdout and getting user input. + */ +std::unique_ptr makeTeeLogger( + std::unique_ptr mainLogger, + std::vector> && extraLoggers); std::unique_ptr makeJSONLogger(Descriptor fd, bool includeNixPrefix = true); diff --git a/src/libutil/tee-logger.cc b/src/libutil/tee-logger.cc index 84527ffde..cb2548264 100644 --- a/src/libutil/tee-logger.cc +++ b/src/libutil/tee-logger.cc @@ -100,9 +100,14 @@ struct TeeLogger : Logger } }; -std::unique_ptr makeTeeLogger(std::vector> && loggers) +std::unique_ptr +makeTeeLogger(std::unique_ptr mainLogger, std::vector> && extraLoggers) { - return std::make_unique(std::move(loggers)); + std::vector> allLoggers; + allLoggers.push_back(std::move(mainLogger)); + for (auto & l : extraLoggers) + allLoggers.push_back(std::move(l)); + return std::make_unique(std::move(allLoggers)); } }