105 lines
2.6 KiB
C++
105 lines
2.6 KiB
C++
#include "logger.h"
|
|
|
|
#include <spdlog/async.h>
|
|
#include <spdlog/sinks/stdout_color_sinks.h>
|
|
#include <spdlog/sinks/basic_file_sink.h>
|
|
#include <spdlog/sinks/rotating_file_sink.h>
|
|
|
|
mirai::logger::logger(logger_config config) : config_(config){
|
|
sinks_.clear();
|
|
|
|
if (config_.console_enabled) {
|
|
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
|
|
console_sink->set_level(to_spdlog_level(config_.level));
|
|
sinks_.push_back(console_sink);
|
|
}
|
|
|
|
if (config_.file_enabled) {
|
|
auto log_dir = config_.file_path.parent_path();
|
|
if (!log_dir.empty() && !std::filesystem::exists(log_dir)) {
|
|
std::filesystem::create_directory(log_dir);
|
|
}
|
|
|
|
if (config_.file_rotation_enabled) {
|
|
auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(
|
|
config_.file_path.string(),
|
|
config_.max_file_size,
|
|
config_.max_files
|
|
);
|
|
file_sink->set_level(to_spdlog_level(config_.level));
|
|
sinks_.push_back(file_sink);
|
|
} else {
|
|
auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(
|
|
config_.file_path.string(),
|
|
true
|
|
);
|
|
file_sink->set_level(to_spdlog_level(config_.level));
|
|
sinks_.push_back(file_sink);
|
|
}
|
|
}
|
|
|
|
if (config_.async_enabled) {
|
|
// 初始化异步日志线程池
|
|
spdlog::init_thread_pool(config_.async_queue_size, 1);
|
|
spdlog_logger_ = std::make_shared<spdlog::async_logger>(
|
|
config_.name,
|
|
sinks_.begin(),
|
|
sinks_.end(),
|
|
spdlog::thread_pool(),
|
|
spdlog::async_overflow_policy::block
|
|
);
|
|
} else {
|
|
spdlog_logger_ = std::make_shared<spdlog::logger>(
|
|
config_.name,
|
|
sinks_.begin(),
|
|
sinks_.end()
|
|
);
|
|
}
|
|
|
|
// 设置日志级别
|
|
spdlog_logger_->set_level(to_spdlog_level(config_.level));
|
|
|
|
// 设置日志格式
|
|
spdlog_logger_->set_pattern(config_.pattern);
|
|
|
|
// 设置刷新策略
|
|
spdlog_logger_->flush_on(spdlog::level::warn);
|
|
|
|
// 注册到 spdlog
|
|
spdlog::register_logger(spdlog_logger_);
|
|
}
|
|
|
|
mirai::logger::~logger() {
|
|
if (spdlog_logger_) {
|
|
spdlog_logger_->flush();
|
|
spdlog::drop(spdlog_logger_->name());
|
|
}
|
|
}
|
|
|
|
void mirai::logger::set_level(log_level level) {
|
|
config_.level = level;
|
|
if (spdlog_logger_) {
|
|
spdlog_logger_->set_level(to_spdlog_level(level));
|
|
}
|
|
for (auto& sink : sinks_) {
|
|
sink->set_level(to_spdlog_level(level));
|
|
}
|
|
}
|
|
|
|
void mirai::logger::set_pattern(const std::string& pattern) {
|
|
config_.pattern = pattern;
|
|
if (spdlog_logger_) {
|
|
spdlog_logger_->set_pattern(pattern);
|
|
}
|
|
}
|
|
|
|
bool mirai::logger::should_log(log_level level) const noexcept {
|
|
return spdlog_logger_ && spdlog_logger_->should_log(to_spdlog_level(level));
|
|
}
|
|
|
|
void mirai::logger::flush() {
|
|
if (spdlog_logger_) {
|
|
spdlog_logger_->flush();
|
|
}
|
|
}
|