60 lines
1.6 KiB
C++
60 lines
1.6 KiB
C++
#pragma once
|
|
|
|
#include <functional>
|
|
#include <mutex>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
enum class LogLevel { debug = 0, info = 1, warning = 2, error = 3 };
|
|
|
|
class DaliLog {
|
|
public:
|
|
static DaliLog& instance() {
|
|
static DaliLog inst;
|
|
return inst;
|
|
}
|
|
|
|
void setLevel(LogLevel level) {
|
|
std::lock_guard<std::mutex> lock(mu_);
|
|
level_ = level;
|
|
}
|
|
|
|
LogLevel currentLevel() const { return level_; }
|
|
|
|
void setSink(std::function<void(const std::string&)> sink) {
|
|
std::lock_guard<std::mutex> lock(mu_);
|
|
sink_ = std::move(sink);
|
|
}
|
|
|
|
void debugLog(const std::string& message) { log(LogLevel::debug, "DEBUG", message); }
|
|
void infoLog(const std::string& message) { log(LogLevel::info, "INFO", message); }
|
|
void warningLog(const std::string& message) { log(LogLevel::warning, "WARNING", message); }
|
|
void errorLog(const std::string& message) { log(LogLevel::error, "ERROR", message); }
|
|
|
|
std::vector<std::string> logMessages() const {
|
|
std::lock_guard<std::mutex> lock(mu_);
|
|
return logs_;
|
|
}
|
|
|
|
void clearLogs() {
|
|
std::lock_guard<std::mutex> lock(mu_);
|
|
logs_.clear();
|
|
}
|
|
|
|
private:
|
|
DaliLog() = default;
|
|
|
|
void log(LogLevel level, const char* tag, const std::string& message) {
|
|
std::lock_guard<std::mutex> lock(mu_);
|
|
if (static_cast<int>(level) < static_cast<int>(level_)) return;
|
|
const std::string line = std::string("[") + tag + "] " + message;
|
|
logs_.push_back(line);
|
|
if (sink_) sink_(line);
|
|
}
|
|
|
|
mutable std::mutex mu_;
|
|
LogLevel level_ = LogLevel::info;
|
|
std::vector<std::string> logs_;
|
|
std::function<void(const std::string&)> sink_;
|
|
};
|