1#include "nix-eval/src/logging.rs"2#include "logging.hh"3#include <nix/util/logging.hh>45using namespace nix;67struct TracingLogger : Logger {8 TracingLogger() {}910 bool isVerbose() override { return true; }11 // void addFields(nlohmann::json & json, const Fields & fields)12 // {13 // if (fields.empty())14 // return;15 // auto & arr = json["fields"] = nlohmann::json::array();16 // for (auto & f : fields)17 // if (f.type == Logger::Field::tInt)18 // arr.push_back(f.i);19 // else if (f.type == Logger::Field::tString)20 // arr.push_back(f.s);21 // else22 // unreachable();23 // }24 void log(Verbosity lvl, std::string_view s) override {25 rust::Str str(s.data(), s.size());26 emit_log(lvl, str);27 }28 void logEI(const ErrorInfo &ei) override { emit_log(ei.level, ei.msg.str()); }2930 void startActivity(ActivityId act, Verbosity lvl, ActivityType type,31 const std::string &s, const Fields &fields,32 ActivityId parent) override {33 auto b = new_start_activity(act, lvl, type);34 for (auto &f : fields) {35 if (f.type == Logger::Field::tInt) {36 b->add_int_field(f.i);37 } else if (f.type == Logger::Field::tString) {38 b->add_string_field(f.s);39 } else {40 unreachable();41 }42 }43 b->emit(parent, s);44 };4546 void stopActivity(ActivityId act) override { emit_stop(act); };4748 void result(ActivityId act, ResultType type, const Fields &fields) override {49 auto b = new_start_activity(act, 0, type);50 for (auto &f : fields) {51 if (f.type == Logger::Field::tInt) {52 b->add_int_field(f.i);53 } else if (f.type == Logger::Field::tString) {54 b->add_string_field(f.s);55 } else {56 unreachable();57 }58 }59 b->emit_result(type);60 };6162 void writeToStdout(std::string_view s) override {63 printf("writeToStdout() called\n");64 }65 void warn(const std::string &msg) override { emit_warn(msg); }6667 virtual std::optional<char> ask(std::string_view s) {68 printf("ask() called\n");69 return {};70 }71};7273extern "C" {74void apply_tracing_logger() { logger = std::make_unique<TracingLogger>(); }75}