Files
mirai/src/core/logger.cpp

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();
}
}