You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
2.9 KiB
C++
90 lines
2.9 KiB
C++
#pragma once
|
|
#include <string>
|
|
#include <iostream>
|
|
#include <unordered_map>
|
|
#include <unordered_set>
|
|
#include <memory>
|
|
#include <mutex>
|
|
|
|
class Logger {
|
|
public:
|
|
enum class Severity {
|
|
Debug,
|
|
Info,
|
|
Warning,
|
|
Error
|
|
};
|
|
|
|
// Получить логгер по категории (создаёт, если нет)
|
|
static Logger& get(const std::string& category) {
|
|
std::lock_guard<std::mutex> lock(registry_mutex_);
|
|
auto it = registry_.find(category);
|
|
if (it == registry_.end()) {
|
|
auto logger = std::unique_ptr<Logger>(new Logger(category));
|
|
auto [inserted_it, _] = registry_.emplace(category, std::move(logger));
|
|
return *(inserted_it->second);
|
|
}
|
|
return *(it->second);
|
|
}
|
|
|
|
// Настроить suppression для категории
|
|
static void suppressCategory(const std::string& category) {
|
|
get(category).suppressed_ = true;
|
|
}
|
|
static void unsuppressCategory(const std::string& category) {
|
|
get(category).suppressed_ = false;
|
|
}
|
|
static void setMinSeverity(const std::string& category, Severity level) {
|
|
get(category).min_severity_ = level;
|
|
}
|
|
static Severity getMinSeverity(const std::string& category) {
|
|
return get(category).min_severity_;
|
|
}
|
|
static bool isSuppressed(const std::string& category) {
|
|
return get(category).suppressed_;
|
|
}
|
|
|
|
void log(const std::string& message, Severity severity = Severity::Info) const {
|
|
if (suppressed_) return;
|
|
if (severity < min_severity_) return;
|
|
std::cout << "[" << category_ << "] " << severityToString(severity) << ": " << message << std::endl << std::flush;
|
|
}
|
|
|
|
// Удобные методы для логирования по уровню
|
|
void dbg(const std::string& message) const { log(message, Severity::Debug); }
|
|
void info(const std::string& message) const { log(message, Severity::Info); }
|
|
void warn(const std::string& message) const { log(message, Severity::Warning); }
|
|
void err(const std::string& message) const { log(message, Severity::Error); }
|
|
|
|
static std::string severityToString(Severity severity) {
|
|
switch (severity) {
|
|
case Severity::Debug: return "DEBUG";
|
|
case Severity::Info: return "INFO";
|
|
case Severity::Warning: return "WARNING";
|
|
case Severity::Error: return "ERROR";
|
|
default: return "UNKNOWN";
|
|
}
|
|
}
|
|
|
|
const std::string& category() const { return category_; }
|
|
Severity minSeverity() const { return min_severity_; }
|
|
void setMinSeverity(Severity s) { min_severity_ = s; }
|
|
bool suppressed() const { return suppressed_; }
|
|
void setSuppressed(bool s) { suppressed_ = s; }
|
|
|
|
private:
|
|
explicit Logger(std::string category)
|
|
: category_(std::move(category)), min_severity_(Severity::Debug), suppressed_(false) {}
|
|
|
|
std::string category_;
|
|
Severity min_severity_;
|
|
bool suppressed_;
|
|
|
|
static std::unordered_map<std::string, std::unique_ptr<Logger>> registry_;
|
|
static std::mutex registry_mutex_;
|
|
};
|
|
|
|
// Определения статических членов
|
|
inline std::unordered_map<std::string, std::unique_ptr<Logger>> Logger::registry_{};
|
|
inline std::mutex Logger::registry_mutex_;
|