humanus.cpp/logger.h

64 lines
2.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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