chore(3p/nix/libutil): Remove logging implementation
This commit is contained in:
parent
74f7033544
commit
c584480cd4
3 changed files with 0 additions and 437 deletions
227
third_party/nix/src/libutil/logging.cc
vendored
227
third_party/nix/src/libutil/logging.cc
vendored
|
@ -1,227 +0,0 @@
|
|||
#include "logging.hh"
|
||||
#include <atomic>
|
||||
#include <nlohmann/json.hpp>
|
||||
#include "util.hh"
|
||||
|
||||
namespace nix {
|
||||
|
||||
static thread_local ActivityId curActivity = 0;
|
||||
|
||||
ActivityId getCurActivity() { return curActivity; }
|
||||
void setCurActivity(const ActivityId activityId) { curActivity = activityId; }
|
||||
|
||||
Logger* logger = makeDefaultLogger();
|
||||
|
||||
void Logger::warn(const std::string& msg) {
|
||||
log(lvlWarn, ANSI_RED "warning:" ANSI_NORMAL " " + msg);
|
||||
}
|
||||
|
||||
class SimpleLogger : public Logger {
|
||||
public:
|
||||
bool systemd, tty;
|
||||
|
||||
SimpleLogger() {
|
||||
systemd = getEnv("IN_SYSTEMD") == "1";
|
||||
tty = isatty(STDERR_FILENO);
|
||||
}
|
||||
|
||||
void log(Verbosity lvl, const FormatOrString& fs) override {
|
||||
if (lvl > verbosity) return;
|
||||
|
||||
std::string prefix;
|
||||
|
||||
if (systemd) {
|
||||
char c;
|
||||
switch (lvl) {
|
||||
case lvlError:
|
||||
c = '3';
|
||||
break;
|
||||
case lvlWarn:
|
||||
c = '4';
|
||||
break;
|
||||
case lvlInfo:
|
||||
c = '5';
|
||||
break;
|
||||
case lvlTalkative:
|
||||
case lvlChatty:
|
||||
c = '6';
|
||||
break;
|
||||
default:
|
||||
c = '7';
|
||||
}
|
||||
prefix = std::string("<") + c + ">";
|
||||
}
|
||||
|
||||
writeToStderr(prefix + filterANSIEscapes(fs.s, !tty) + "\n");
|
||||
}
|
||||
|
||||
void startActivity(ActivityId act, Verbosity lvl, ActivityType type,
|
||||
const std::string& s, const Fields& fields,
|
||||
ActivityId parent) override {
|
||||
if (lvl <= verbosity && !s.empty()) log(lvl, s + "...");
|
||||
}
|
||||
};
|
||||
|
||||
Verbosity verbosity = lvlInfo;
|
||||
|
||||
void warnOnce(bool& haveWarned, const FormatOrString& fs) {
|
||||
if (!haveWarned) {
|
||||
warn(fs.s);
|
||||
haveWarned = true;
|
||||
}
|
||||
}
|
||||
|
||||
void writeToStderr(const string& s) {
|
||||
try {
|
||||
writeFull(STDERR_FILENO, s, false);
|
||||
} catch (SysError& e) {
|
||||
/* Ignore failing writes to stderr. We need to ignore write
|
||||
errors to ensure that cleanup code that logs to stderr runs
|
||||
to completion if the other side of stderr has been closed
|
||||
unexpectedly. */
|
||||
}
|
||||
}
|
||||
|
||||
Logger* makeDefaultLogger() { return new SimpleLogger(); }
|
||||
|
||||
std::atomic<uint64_t> nextId{(uint64_t)getpid() << 32};
|
||||
|
||||
Activity::Activity(Logger& logger, Verbosity lvl, ActivityType type,
|
||||
const std::string& s, const Logger::Fields& fields,
|
||||
ActivityId parent)
|
||||
: logger(logger), id(nextId++) {
|
||||
logger.startActivity(id, lvl, type, s, fields, parent);
|
||||
}
|
||||
|
||||
struct JSONLogger : Logger {
|
||||
Logger& prevLogger;
|
||||
|
||||
JSONLogger(Logger& prevLogger) : prevLogger(prevLogger) {}
|
||||
|
||||
void addFields(nlohmann::json& json, const Fields& fields) {
|
||||
if (fields.empty()) return;
|
||||
auto& arr = json["fields"] = nlohmann::json::array();
|
||||
for (auto& f : fields)
|
||||
if (f.type == Logger::Field::tInt)
|
||||
arr.push_back(f.i);
|
||||
else if (f.type == Logger::Field::tString)
|
||||
arr.push_back(f.s);
|
||||
else
|
||||
abort();
|
||||
}
|
||||
|
||||
void write(const nlohmann::json& json) {
|
||||
prevLogger.log(lvlError, "@nix " + json.dump());
|
||||
}
|
||||
|
||||
void log(Verbosity lvl, const FormatOrString& fs) override {
|
||||
nlohmann::json json;
|
||||
json["action"] = "msg";
|
||||
json["level"] = lvl;
|
||||
json["msg"] = fs.s;
|
||||
write(json);
|
||||
}
|
||||
|
||||
void startActivity(ActivityId act, Verbosity lvl, ActivityType type,
|
||||
const std::string& s, const Fields& fields,
|
||||
ActivityId parent) override {
|
||||
nlohmann::json json;
|
||||
json["action"] = "start";
|
||||
json["id"] = act;
|
||||
json["level"] = lvl;
|
||||
json["type"] = type;
|
||||
json["text"] = s;
|
||||
addFields(json, fields);
|
||||
// FIXME: handle parent
|
||||
write(json);
|
||||
}
|
||||
|
||||
void stopActivity(ActivityId act) override {
|
||||
nlohmann::json json;
|
||||
json["action"] = "stop";
|
||||
json["id"] = act;
|
||||
write(json);
|
||||
}
|
||||
|
||||
void result(ActivityId act, ResultType type, const Fields& fields) override {
|
||||
nlohmann::json json;
|
||||
json["action"] = "result";
|
||||
json["id"] = act;
|
||||
json["type"] = type;
|
||||
addFields(json, fields);
|
||||
write(json);
|
||||
}
|
||||
};
|
||||
|
||||
Logger* makeJSONLogger(Logger& prevLogger) {
|
||||
return new JSONLogger(prevLogger);
|
||||
}
|
||||
|
||||
static Logger::Fields getFields(nlohmann::json& json) {
|
||||
Logger::Fields fields;
|
||||
for (auto& f : json) {
|
||||
if (f.type() == nlohmann::json::value_t::number_unsigned)
|
||||
fields.emplace_back(Logger::Field(f.get<uint64_t>()));
|
||||
else if (f.type() == nlohmann::json::value_t::string)
|
||||
fields.emplace_back(Logger::Field(f.get<std::string>()));
|
||||
else
|
||||
throw Error("unsupported JSON type %d", (int)f.type());
|
||||
}
|
||||
return fields;
|
||||
}
|
||||
|
||||
bool handleJSONLogMessage(const std::string& msg, const Activity& act,
|
||||
std::map<ActivityId, Activity>& activities,
|
||||
bool trusted) {
|
||||
if (!hasPrefix(msg, "@nix ")) return false;
|
||||
|
||||
try {
|
||||
auto json = nlohmann::json::parse(std::string(msg, 5));
|
||||
|
||||
std::string action = json["action"];
|
||||
|
||||
if (action == "start") {
|
||||
auto type = (ActivityType)json["type"];
|
||||
if (trusted || type == actDownload)
|
||||
activities.emplace(
|
||||
std::piecewise_construct, std::forward_as_tuple(json["id"]),
|
||||
std::forward_as_tuple(*logger, (Verbosity)json["level"], type,
|
||||
json["text"], getFields(json["fields"]),
|
||||
act.id));
|
||||
}
|
||||
|
||||
else if (action == "stop")
|
||||
activities.erase((ActivityId)json["id"]);
|
||||
|
||||
else if (action == "result") {
|
||||
auto i = activities.find((ActivityId)json["id"]);
|
||||
if (i != activities.end())
|
||||
i->second.result((ResultType)json["type"], getFields(json["fields"]));
|
||||
}
|
||||
|
||||
else if (action == "setPhase") {
|
||||
std::string phase = json["phase"];
|
||||
act.result(resSetPhase, phase);
|
||||
}
|
||||
|
||||
else if (action == "msg") {
|
||||
std::string msg = json["msg"];
|
||||
logger->log((Verbosity)json["level"], msg);
|
||||
}
|
||||
|
||||
} catch (std::exception& e) {
|
||||
printError("bad log message from builder: %s", e.what());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Activity::~Activity() {
|
||||
try {
|
||||
logger.stopActivity(id);
|
||||
} catch (...) {
|
||||
ignoreException();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace nix
|
168
third_party/nix/src/libutil/logging.hh
vendored
168
third_party/nix/src/libutil/logging.hh
vendored
|
@ -1,168 +0,0 @@
|
|||
#pragma once
|
||||
|
||||
#include "types.hh"
|
||||
|
||||
namespace nix {
|
||||
|
||||
typedef enum {
|
||||
lvlError = 0,
|
||||
lvlWarn,
|
||||
lvlInfo,
|
||||
lvlTalkative,
|
||||
lvlChatty,
|
||||
lvlDebug,
|
||||
lvlVomit
|
||||
} Verbosity;
|
||||
|
||||
typedef enum {
|
||||
actUnknown = 0,
|
||||
actCopyPath = 100,
|
||||
actDownload = 101,
|
||||
actRealise = 102,
|
||||
actCopyPaths = 103,
|
||||
actBuilds = 104,
|
||||
actBuild = 105,
|
||||
actOptimiseStore = 106,
|
||||
actVerifyPaths = 107,
|
||||
actSubstitute = 108,
|
||||
actQueryPathInfo = 109,
|
||||
actPostBuildHook = 110,
|
||||
} ActivityType;
|
||||
|
||||
typedef enum {
|
||||
resFileLinked = 100,
|
||||
resBuildLogLine = 101,
|
||||
resUntrustedPath = 102,
|
||||
resCorruptedPath = 103,
|
||||
resSetPhase = 104,
|
||||
resProgress = 105,
|
||||
resSetExpected = 106,
|
||||
resPostBuildLogLine = 107,
|
||||
} ResultType;
|
||||
|
||||
typedef uint64_t ActivityId;
|
||||
|
||||
class Logger {
|
||||
friend struct Activity;
|
||||
|
||||
public:
|
||||
struct Field {
|
||||
// FIXME: use std::variant.
|
||||
enum { tInt = 0, tString = 1 } type;
|
||||
uint64_t i = 0;
|
||||
std::string s;
|
||||
Field(const std::string& s) : type(tString), s(s) {}
|
||||
Field(const char* s) : type(tString), s(s) {}
|
||||
Field(const uint64_t& i) : type(tInt), i(i) {}
|
||||
};
|
||||
|
||||
typedef std::vector<Field> Fields;
|
||||
|
||||
virtual ~Logger() {}
|
||||
|
||||
virtual void log(Verbosity lvl, const FormatOrString& fs) = 0;
|
||||
|
||||
void log(const FormatOrString& fs) { log(lvlInfo, fs); }
|
||||
|
||||
virtual void warn(const std::string& msg);
|
||||
|
||||
virtual void startActivity(ActivityId act, Verbosity lvl, ActivityType type,
|
||||
const std::string& s, const Fields& fields,
|
||||
ActivityId parent){};
|
||||
|
||||
virtual void stopActivity(ActivityId act){};
|
||||
|
||||
virtual void result(ActivityId act, ResultType type, const Fields& fields){};
|
||||
};
|
||||
|
||||
ActivityId getCurActivity();
|
||||
void setCurActivity(const ActivityId activityId);
|
||||
|
||||
struct Activity {
|
||||
Logger& logger;
|
||||
|
||||
const ActivityId id;
|
||||
|
||||
Activity(Logger& logger, Verbosity lvl, ActivityType type,
|
||||
const std::string& s = "", const Logger::Fields& fields = {},
|
||||
ActivityId parent = getCurActivity());
|
||||
|
||||
Activity(Logger& logger, ActivityType type, const Logger::Fields& fields = {},
|
||||
ActivityId parent = getCurActivity())
|
||||
: Activity(logger, lvlError, type, "", fields, parent){};
|
||||
|
||||
Activity(const Activity& act) = delete;
|
||||
|
||||
~Activity();
|
||||
|
||||
void progress(uint64_t done = 0, uint64_t expected = 0, uint64_t running = 0,
|
||||
uint64_t failed = 0) const {
|
||||
result(resProgress, done, expected, running, failed);
|
||||
}
|
||||
|
||||
void setExpected(ActivityType type2, uint64_t expected) const {
|
||||
result(resSetExpected, type2, expected);
|
||||
}
|
||||
|
||||
template <typename... Args>
|
||||
void result(ResultType type, const Args&... args) const {
|
||||
Logger::Fields fields;
|
||||
nop{(fields.emplace_back(Logger::Field(args)), 1)...};
|
||||
result(type, fields);
|
||||
}
|
||||
|
||||
void result(ResultType type, const Logger::Fields& fields) const {
|
||||
logger.result(id, type, fields);
|
||||
}
|
||||
|
||||
friend class Logger;
|
||||
};
|
||||
|
||||
struct PushActivity {
|
||||
const ActivityId prevAct;
|
||||
PushActivity(ActivityId act) : prevAct(getCurActivity()) {
|
||||
setCurActivity(act);
|
||||
}
|
||||
~PushActivity() { setCurActivity(prevAct); }
|
||||
};
|
||||
|
||||
extern Logger* logger;
|
||||
|
||||
Logger* makeDefaultLogger();
|
||||
|
||||
Logger* makeJSONLogger(Logger& prevLogger);
|
||||
|
||||
bool handleJSONLogMessage(const std::string& msg, const Activity& act,
|
||||
std::map<ActivityId, Activity>& activities,
|
||||
bool trusted);
|
||||
|
||||
extern Verbosity verbosity; /* suppress msgs > this */
|
||||
|
||||
/* Print a message if the current log level is at least the specified
|
||||
level. Note that this has to be implemented as a macro to ensure
|
||||
that the arguments are evaluated lazily. */
|
||||
#define printMsg(level, args...) \
|
||||
do { \
|
||||
if (level <= nix::verbosity) { \
|
||||
logger->log(level, fmt(args)); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define printError(args...) printMsg(lvlError, args)
|
||||
#define printInfo(args...) printMsg(lvlInfo, args)
|
||||
#define printTalkative(args...) printMsg(lvlTalkative, args)
|
||||
#define debug(args...) printMsg(lvlDebug, args)
|
||||
#define vomit(args...) printMsg(lvlVomit, args)
|
||||
|
||||
template <typename... Args>
|
||||
inline void warn(const std::string& fs, Args... args) {
|
||||
boost::format f(fs);
|
||||
nop{boost::io::detail::feed(f, args)...};
|
||||
logger->warn(f.str());
|
||||
}
|
||||
|
||||
void warnOnce(bool& haveWarned, const FormatOrString& fs);
|
||||
|
||||
void writeToStderr(const string& s);
|
||||
|
||||
} // namespace nix
|
42
third_party/nix/src/libutil/meson.build
vendored
42
third_party/nix/src/libutil/meson.build
vendored
|
@ -1,12 +1,3 @@
|
|||
# Nix lib store build file
|
||||
#============================================================================
|
||||
|
||||
|
||||
|
||||
|
||||
# src files
|
||||
#============================================================================
|
||||
|
||||
src_inc += include_directories('.')
|
||||
|
||||
libutil_src = files(
|
||||
|
@ -17,7 +8,6 @@ libutil_src = files(
|
|||
join_paths(meson.source_root(), 'src/libutil/config.cc'),
|
||||
join_paths(meson.source_root(), 'src/libutil/hash.cc'),
|
||||
join_paths(meson.source_root(), 'src/libutil/json.cc'),
|
||||
join_paths(meson.source_root(), 'src/libutil/logging.cc'),
|
||||
join_paths(meson.source_root(), 'src/libutil/serialise.cc'),
|
||||
join_paths(meson.source_root(), 'src/libutil/thread-pool.cc'),
|
||||
join_paths(meson.source_root(), 'src/libutil/util.cc'),
|
||||
|
@ -34,7 +24,6 @@ libutil_headers = files(
|
|||
join_paths(meson.source_root(), 'src/libutil/istringstream_nocopy.hh'),
|
||||
join_paths(meson.source_root(), 'src/libutil/json.hh'),
|
||||
join_paths(meson.source_root(), 'src/libutil/lazy.hh'),
|
||||
join_paths(meson.source_root(), 'src/libutil/logging.hh'),
|
||||
join_paths(meson.source_root(), 'src/libutil/lru-cache.hh'),
|
||||
join_paths(meson.source_root(), 'src/libutil/monitor-fd.hh'),
|
||||
join_paths(meson.source_root(), 'src/libutil/pool.hh'),
|
||||
|
@ -47,11 +36,6 @@ libutil_headers = files(
|
|||
join_paths(meson.source_root(), 'src/libutil/xml-writer.hh')
|
||||
)
|
||||
|
||||
|
||||
|
||||
# dependancies
|
||||
#============================================================================
|
||||
|
||||
libutil_dep_list = [
|
||||
boost_dep,
|
||||
libbz2_dep,
|
||||
|
@ -61,36 +45,10 @@ libutil_dep_list = [
|
|||
pthread_dep,
|
||||
libsodium_dep]
|
||||
|
||||
|
||||
|
||||
|
||||
# Link args
|
||||
#============================================================================
|
||||
|
||||
libutil_link_list = []
|
||||
|
||||
libutil_link_args = []
|
||||
|
||||
|
||||
|
||||
|
||||
# compiler args
|
||||
#============================================================================
|
||||
|
||||
libutil_cxx_args = []
|
||||
|
||||
|
||||
|
||||
|
||||
# targets
|
||||
#============================================================================
|
||||
|
||||
|
||||
|
||||
|
||||
# build
|
||||
#============================================================================
|
||||
|
||||
libutil_lib = library(
|
||||
'nixutil',
|
||||
install : true,
|
||||
|
|
Loading…
Reference in a new issue