-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathtee-logger.cc
107 lines (91 loc) · 2.58 KB
/
tee-logger.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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));
}
}