From 0fab0644da5d57f30a5ee85119a43ad99769e652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Roche?= Date: Mon, 21 Aug 2023 19:37:02 +0200 Subject: [PATCH] Add basic json logger It closely resembles the current Internal JSON logger, with the exception that we have eliminated the `@nix` prefix. refs #7853 --- src/libmain/loggers.cc | 6 +++++- src/libmain/loggers.hh | 1 + src/libutil/logging.cc | 13 +++++++++---- src/libutil/logging.hh | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/libmain/loggers.cc b/src/libmain/loggers.cc index cda5cb939..cd56d68f5 100644 --- a/src/libmain/loggers.cc +++ b/src/libmain/loggers.cc @@ -13,6 +13,8 @@ LogFormat parseLogFormat(const std::string & logFormatStr) { return LogFormat::rawWithLogs; else if (logFormatStr == "internal-json") return LogFormat::internalJSON; + else if (logFormatStr == "json") + return LogFormat::json; else if (logFormatStr == "bar") return LogFormat::bar; else if (logFormatStr == "bar-with-logs") @@ -27,7 +29,9 @@ Logger * makeDefaultLogger() { case LogFormat::rawWithLogs: return makeSimpleLogger(true); case LogFormat::internalJSON: - return makeJSONLogger(*makeSimpleLogger(true)); + return makeJSONLogger(*makeSimpleLogger(true), true); + case LogFormat::json: + return makeJSONLogger(*makeSimpleLogger(true), false); case LogFormat::bar: return makeProgressBar(); case LogFormat::barWithLogs: { diff --git a/src/libmain/loggers.hh b/src/libmain/loggers.hh index e5721420c..f1d5ac9bc 100644 --- a/src/libmain/loggers.hh +++ b/src/libmain/loggers.hh @@ -11,6 +11,7 @@ enum class LogFormat { internalJSON, bar, barWithLogs, + json, }; void setLogFormat(const std::string & logFormatStr); diff --git a/src/libutil/logging.cc b/src/libutil/logging.cc index 54702e4ea..97189e0f9 100644 --- a/src/libutil/logging.cc +++ b/src/libutil/logging.cc @@ -150,8 +150,9 @@ void to_json(nlohmann::json & json, std::shared_ptr pos) struct JSONLogger : Logger { Logger & prevLogger; + bool internalJSON; - JSONLogger(Logger & prevLogger) : prevLogger(prevLogger) { } + JSONLogger(Logger & prevLogger, bool internalJSON) : prevLogger(prevLogger) { } bool isVerbose() override { return true; @@ -172,7 +173,11 @@ struct JSONLogger : Logger { void write(const nlohmann::json & json) { - prevLogger.log(lvlError, "@nix " + json.dump(-1, ' ', false, nlohmann::json::error_handler_t::replace)); + if (internalJSON) { + prevLogger.log(lvlError, "@nix " + json.dump(-1, ' ', false, nlohmann::json::error_handler_t::replace)); + } else { + prevLogger.log(lvlError, json.dump(-1, ' ', true, nlohmann::json::error_handler_t::replace)); + } } void log(Verbosity lvl, std::string_view s) override @@ -244,9 +249,9 @@ struct JSONLogger : Logger { } }; -Logger * makeJSONLogger(Logger & prevLogger) +Logger * makeJSONLogger(Logger & prevLogger, bool internalJSON) { - return new JSONLogger(prevLogger); + return new JSONLogger(prevLogger, internalJSON); } static Logger::Fields getFields(nlohmann::json & json) diff --git a/src/libutil/logging.hh b/src/libutil/logging.hh index 5aa6bee95..a71011de1 100644 --- a/src/libutil/logging.hh +++ b/src/libutil/logging.hh @@ -171,7 +171,7 @@ extern Logger * logger; Logger * makeSimpleLogger(bool printBuildLogs = true); -Logger * makeJSONLogger(Logger & prevLogger); +Logger * makeJSONLogger(Logger & prevLogger, bool internalJSON = true); std::optional parseJSONMessage(const std::string & msg);