difftreelog
fix logs may contain non-utf8 lines, use lossy conversion
in: trunk
2 files changed
crates/nix-eval/src/logging.ccdiffbeforeafterboth1#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 log(Verbosity lvl, std::string_view s) override {12 rust::Str str(s.data(), s.size());13 emit_log(lvl, str);14 }15 void logEI(const ErrorInfo &ei) override { emit_log(ei.level, ei.msg.str()); }1617 void startActivity(ActivityId act, Verbosity lvl, ActivityType type,18 const std::string &s, const Fields &fields,19 ActivityId parent) override {20 auto b = new_start_activity(act, lvl, type);21 for (auto &f : fields) {22 if (f.type == Logger::Field::tInt) {23 b->add_int_field(f.i);24 } else if (f.type == Logger::Field::tString) {25 b->add_string_field(f.s);26 } else {27 unreachable();28 }29 }30 b->emit(parent, s);31 };3233 void stopActivity(ActivityId act) override { emit_stop(act); };3435 void result(ActivityId act, ResultType type, const Fields &fields) override {36 auto b = new_start_activity(act, 0, type);37 for (auto &f : fields) {38 if (f.type == Logger::Field::tInt) {39 b->add_int_field(f.i);40 } else if (f.type == Logger::Field::tString) {41 b->add_string_field(f.s);42 } else {43 unreachable();44 }45 }46 b->emit_result(type);47 };4849 void writeToStdout(std::string_view s) override {50 emit_warn("writeToStdout() called, but unsupported");51 }52 void warn(const std::string &msg) override { emit_warn(msg); }5354 virtual std::optional<char> ask(std::string_view s) {55 emit_warn("ask() called, but unsupported");56 return {};57 }58};5960extern "C" {61void apply_tracing_logger() {62 logger = std::make_unique<TracingLogger>();63 // verbosity = lvlVomit;64}65}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 log(Verbosity lvl, std::string_view s) override {12 rust::Slice<const unsigned char> str(reinterpret_cast<const unsigned char*>(s.data()), s.size());13 emit_log(lvl, str);14 }15 void logEI(const ErrorInfo &ei) override {16 auto s = ei.msg.str();17 rust::Slice<const unsigned char> str(reinterpret_cast<const unsigned char*>(s.data()), s.size());18 emit_log(ei.level, str);19 }2021 void startActivity(ActivityId act, Verbosity lvl, ActivityType type,22 const std::string &s, const Fields &fields,23 ActivityId parent) override {24 auto b = new_start_activity(act, lvl, type);25 for (auto &f : fields) {26 if (f.type == Logger::Field::tInt) {27 b->add_int_field(f.i);28 } else if (f.type == Logger::Field::tString) {29 auto s = &f.s;30 rust::Slice<const unsigned char> str(reinterpret_cast<const unsigned char*>(s->data()), s->size());31 b->add_string_field(str);32 } else {33 unreachable();34 }35 }36 b->emit(parent, s);37 };3839 void stopActivity(ActivityId act) override { emit_stop(act); };4041 void result(ActivityId act, ResultType type, const Fields &fields) override {42 auto b = new_start_activity(act, 0, type);43 for (auto &f : fields) {44 if (f.type == Logger::Field::tInt) {45 b->add_int_field(f.i);46 } else if (f.type == Logger::Field::tString) {47 auto s = &f.s;48 rust::Slice<const unsigned char> str(reinterpret_cast<const unsigned char*>(s->data()), s->size());49 b->add_string_field(str);50 } else {51 unreachable();52 }53 }54 b->emit_result(type);55 };5657 void writeToStdout(std::string_view s) override {58 emit_warn("writeToStdout() called, but unsupported");59 }60 void warn(const std::string &msg) override { emit_warn(msg); }6162 virtual std::optional<char> ask(std::string_view s) {63 emit_warn("ask() called, but unsupported");64 return {};65 }66};6768extern "C" {69void apply_tracing_logger() {70 logger = std::make_unique<TracingLogger>();71 // verbosity = lvlVomit;72}73}crates/nix-eval/src/logging.rsdiffbeforeafterboth--- a/crates/nix-eval/src/logging.rs
+++ b/crates/nix-eval/src/logging.rs
@@ -300,8 +300,9 @@
fn add_int_field(&mut self, i: i32) {
self.fields.push(FieldValue::Int(i));
}
- fn add_string_field(&mut self, v: &str) {
- self.fields.push(FieldValue::Str(v.to_owned()));
+ fn add_string_field(&mut self, v: &[u8]) {
+ let v = String::from_utf8_lossy(v);
+ self.fields.push(FieldValue::Str(v.to_string()));
}
fn emit(&mut self, parent: u64, s: &str) {
let mut mapping = NIX_SPAN_MAPPING.lock().expect("not poisoned");
@@ -455,9 +456,10 @@
let mut mapping = NIX_SPAN_MAPPING.lock().expect("not poisoned");
mapping.remove(&v);
}
-fn emit_log(lvl: u32, v: &str) {
+fn emit_log(lvl: u32, v: &[u8]) {
let verbosity = Verbosity::from_int(lvl);
let level: Level = verbosity.into();
+ let v = String::from_utf8_lossy(v);
if level == Level::ERROR {
error!(target: "nix", "{v}")
} else if level == Level::WARN {
@@ -539,13 +541,13 @@
type StartActivityBuilder;
fn new_start_activity(activity_id: u64, lvl: u32, typ: u32) -> Box<StartActivityBuilder>;
fn add_int_field(&mut self, i: i32);
- fn add_string_field(&mut self, v: &str);
+ fn add_string_field(&mut self, v: &[u8]);
fn emit(&mut self, parent: u64, s: &str);
fn emit_result(&mut self, ty: u32);
fn emit_warn(v: &str);
fn emit_stop(id: u64);
- fn emit_log(lvl: u32, v: &str);
+ fn emit_log(lvl: u32, v: &[u8]);
}
unsafe extern "C++" {
include!("nix-eval/src/logging.hh");