mirror of
https://github.com/NixOS/nix.git
synced 2025-11-13 05:56:03 +01:00
-----BEGIN PGP SIGNATURE----- iQFHBAABCAAxFiEEtUHVUwEnDgvPFcpdgXC0cm1xmN4FAmfv9fITHGVkb2xzdHJh QGdtYWlsLmNvbQAKCRCBcLRybXGY3ohrCAC1Uw/JJr3yEPlJ/jLc9t9HqEKMY08W W6SEjpYJHYixMXmoonexkqojncNWBaiytRa+vBY7JQq0xTOOBwj42TM2ZzMF4GXi vO4Ox0hEsRa/v7tSmK6GFz1sNEKEUOHDNbilg4kzkkBHPEGPUGMwdWkT0akO576Q SQ6ERwPPLsHDI2YtAeAD8R4p07CraiyA34ljDPz3rChTAXRPVKWxJUt1enwEWYTr cKk45RcR4S8rP1BVwf3wsNsrHjqjbaY45kPAo8GD79hFH0zkyJarS3Kgv8qsWLra 9ph0DVVG0wiArlET7Y3uchqtAC0Z5LOnutAmOFYFw6DKfWp9yGfl/SVW =XRda -----END PGP SIGNATURE----- Merge tag '2.28.0' into sync-2.28.0 Tagging release 2.28.0
113 lines
2.8 KiB
C++
113 lines
2.8 KiB
C++
#include "nix/util/logging.hh"
|
|
|
|
namespace nix {
|
|
|
|
struct TeeLogger : Logger
|
|
{
|
|
std::vector<std::unique_ptr<Logger>> loggers;
|
|
|
|
TeeLogger(std::vector<std::unique_ptr<Logger>> && loggers)
|
|
: loggers(std::move(loggers))
|
|
{
|
|
}
|
|
|
|
void stop() override
|
|
{
|
|
for (auto & logger : loggers)
|
|
logger->stop();
|
|
};
|
|
|
|
void pause() override
|
|
{
|
|
for (auto & logger : loggers)
|
|
logger->pause();
|
|
};
|
|
|
|
void resume() override
|
|
{
|
|
for (auto & logger : loggers)
|
|
logger->resume();
|
|
};
|
|
|
|
void log(Verbosity lvl, std::string_view s) override
|
|
{
|
|
for (auto & logger : loggers)
|
|
logger->log(lvl, s);
|
|
}
|
|
|
|
void logEI(const ErrorInfo & ei) override
|
|
{
|
|
for (auto & logger : loggers)
|
|
logger->logEI(ei);
|
|
}
|
|
|
|
void startActivity(
|
|
ActivityId act,
|
|
Verbosity lvl,
|
|
ActivityType type,
|
|
const std::string & s,
|
|
const Fields & fields,
|
|
ActivityId parent) override
|
|
{
|
|
for (auto & logger : loggers)
|
|
logger->startActivity(act, lvl, type, s, fields, parent);
|
|
}
|
|
|
|
void stopActivity(ActivityId act) override
|
|
{
|
|
for (auto & logger : loggers)
|
|
logger->stopActivity(act);
|
|
}
|
|
|
|
void result(ActivityId act, ResultType type, const Fields & fields) override
|
|
{
|
|
for (auto & logger : loggers)
|
|
logger->result(act, type, fields);
|
|
}
|
|
|
|
void result(ActivityId act, ResultType type, const nlohmann::json & json) override
|
|
{
|
|
for (auto & logger : loggers)
|
|
logger->result(act, type, json);
|
|
}
|
|
|
|
void writeToStdout(std::string_view s) override
|
|
{
|
|
for (auto & logger : loggers) {
|
|
/* Let only the first logger write to stdout to avoid
|
|
duplication. This means that the first logger needs to
|
|
be the one managing stdout/stderr
|
|
(e.g. `ProgressBar`). */
|
|
logger->writeToStdout(s);
|
|
break;
|
|
}
|
|
}
|
|
|
|
std::optional<char> ask(std::string_view s) override
|
|
{
|
|
for (auto & logger : loggers) {
|
|
auto c = logger->ask(s);
|
|
if (c)
|
|
return c;
|
|
}
|
|
return std::nullopt;
|
|
}
|
|
|
|
void setPrintBuildLogs(bool printBuildLogs) override
|
|
{
|
|
for (auto & logger : loggers)
|
|
logger->setPrintBuildLogs(printBuildLogs);
|
|
}
|
|
};
|
|
|
|
std::unique_ptr<Logger>
|
|
makeTeeLogger(std::unique_ptr<Logger> mainLogger, std::vector<std::unique_ptr<Logger>> && extraLoggers)
|
|
{
|
|
std::vector<std::unique_ptr<Logger>> allLoggers;
|
|
allLoggers.push_back(std::move(mainLogger));
|
|
for (auto & l : extraLoggers)
|
|
allLoggers.push_back(std::move(l));
|
|
return std::make_unique<TeeLogger>(std::move(allLoggers));
|
|
}
|
|
|
|
}
|