mirror of
https://github.com/NixOS/nix.git
synced 2025-11-16 23:42:43 +01:00
Add json-log-path setting
This setting specifies a path (which can be a regular file or Unix domain socket) that receives a copy of all Nix log messages (in JSON format).
This commit is contained in:
parent
0087188d47
commit
7240fb198f
8 changed files with 200 additions and 5 deletions
107
src/libutil/tee-logger.cc
Normal file
107
src/libutil/tee-logger.cc
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
#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 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));
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue