64 lines
2.2 KiB
C
64 lines
2.2 KiB
C
|
#ifndef HUMANUSlogger_H
|
|||
|
#define HUMANUSlogger_H
|
|||
|
|
|||
|
#include "spdlog/spdlog.h"
|
|||
|
#include "spdlog/sinks/stdout_color_sinks.h"
|
|||
|
#include "spdlog/sinks/basic_file_sink.h"
|
|||
|
#include "spdlog/sinks/rotating_file_sink.h"
|
|||
|
#include "spdlog/sinks/daily_file_sink.h"
|
|||
|
#include "spdlog/sinks/dist_sink.h"
|
|||
|
|
|||
|
#include <string>
|
|||
|
|
|||
|
namespace humanus {
|
|||
|
|
|||
|
static spdlog::level::level_enum _print_level = spdlog::level::info;
|
|||
|
|
|||
|
static std::shared_ptr<spdlog::logger> logger = spdlog::default_logger();
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 调整日志级别
|
|||
|
* @param print_level 控制台输出日志级别
|
|||
|
* @param logfile_level 文件记录日志级别
|
|||
|
* @param name 日志文件名前缀
|
|||
|
* @return 日志记录器实例
|
|||
|
*/
|
|||
|
std::shared_ptr<spdlog::logger> define_log_level(spdlog::level::level_enum print_level = spdlog::level::info,
|
|||
|
spdlog::level::level_enum logfile_level = spdlog::level::debug,
|
|||
|
std::string name = "") {
|
|||
|
_print_level = print_level;
|
|||
|
|
|||
|
auto current_date = std::chrono::system_clock::now();
|
|||
|
auto in_time_t = std::chrono::system_clock::to_time_t(current_date);
|
|||
|
|
|||
|
std::stringstream ss;
|
|||
|
std::tm tm_info = *std::localtime(&in_time_t);
|
|||
|
ss << std::put_time(&tm_info, "%Y%m%d");
|
|||
|
std::string formatted_date = ss.str(); // YYYYMMDD
|
|||
|
|
|||
|
std::string log_name = name.empty() ? formatted_date : name + "_" + formatted_date;
|
|||
|
std::string log_file_path = (PROJECT_ROOT / "logs" / (log_name + ".log")).string();
|
|||
|
|
|||
|
// 确保日志目录存在
|
|||
|
std::filesystem::create_directories((PROJECT_ROOT / "logs").string());
|
|||
|
|
|||
|
// 重置日志输出
|
|||
|
// 清除现有的sinks
|
|||
|
logger->sinks().clear();
|
|||
|
|
|||
|
// 添加标准错误输出sink,相当于Python中的sys.stderr
|
|||
|
auto stderr_sink = std::make_shared<spdlog::sinks::stderr_color_sink_mt>();
|
|||
|
stderr_sink->set_level(print_level);
|
|||
|
logger->sinks().push_back(stderr_sink);
|
|||
|
|
|||
|
// 添加文件sink,相当于Python中的PROJECT_ROOT / f"logs/{log_name}.log"
|
|||
|
auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(log_file_path, true);
|
|||
|
file_sink->set_level(logfile_level);
|
|||
|
logger->sinks().push_back(file_sink);
|
|||
|
|
|||
|
return logger;
|
|||
|
}
|
|||
|
|
|||
|
} // namespace humanus
|
|||
|
|
|||
|
#endif
|