SPB Git

spb/wp40_uqo

Public MIT
1.3 KB · 36 lines cpp
1#include "raid/core/log.hpp"2#include <cstdio>3#include <regex>4#include <atomic>56namespace raid::log {78namespace {9std::atomic<int> g_level{static_cast<int>(Level::info)};10std::mutex g_mutex;11Sink g_sink;12const char* name(Level l) {13  switch (l) { case Level::trace: return "TRACE"; case Level::debug: return "DEBUG"; case Level::info: return "INFO"; case Level::warn: return "WARN"; case Level::error: return "ERROR"; default: return "OFF"; }14}15}  // namespace1617void set_level(Level l) { g_level.store(static_cast<int>(l)); }18Level level() { return static_cast<Level>(g_level.load()); }19void set_sink(Sink s) { std::lock_guard<std::mutex> lk(g_mutex); g_sink = std::move(s); }2021std::string redact(std::string_view s) {22  static const std::regex re(R"((Bearer\s+)[A-Za-z0-9._\-]+|fd_[A-Za-z0-9]+\.[A-Za-z0-9_\-]+|(api[_-]?key=)[^&\s]+|(userid=)[^&\s]+)", std::regex::icase);23  return std::regex_replace(std::string(s), re, "$1$2$3<redacted>");24}2526void emit(Level l, std::string_view msg, Fields fields) {27  if (static_cast<int>(l) < g_level.load()) return;28  std::lock_guard<std::mutex> lk(g_mutex);29  if (g_sink) { g_sink(l, msg, fields); return; }30  std::string line = std::string(name(l)) + " " + redact(msg);31  for (auto& [k, v] : fields) line += " " + k + "=" + redact(v);32  std::fprintf(stderr, "%s\n", line.c_str());33}3435}  // namespace raid::log36
Files · d628c807b304dba507dfb8130278ae5bb0f92411
Menu

Theme