spdlog 关于 std::make_shared<spdlog::sinks::rotating_file_sink_mt> 使用详情

问题

关于:std::make_shared<spdlog::sinks::rotating_file_sink_mt> 第一参数大多数例子,包括头文件中给的都是 "logs/log.txt" 字符串样式

代码中使用 string 还是 转成 char * 使用?

查看源码

spdlog.h 中

// Example:
//   auto mylogger = std::make_shared<spdlog::logger>("mylogger", ...);                                                                                                                                                                                                                                                                                              
//   spdlog::initialize_logger(mylogger);

未明确标明用法

进一步查看

spdlog/sinks/rotating_file_sink.h
 

21 template <typename Mutex>
 22 class rotating_file_sink final : public base_sink<Mutex> {
 23 public:
 24     rotating_file_sink(filename_t base_filename,                                                                                                                                                                                                                                                                                                                     
 25                        std::size_t max_size,
 26                        std::size_t max_files,
 27                        bool rotate_on_open = false,
 28                        const file_event_handlers &event_handlers = {});
 29     static filename_t calc_filename(const filename_t &filename, std::size_t index);
 30     filename_t filename();
 31 
 32 protected:
 33     void sink_it_(const details::log_msg &msg) override;
 34     void flush_() override;
 35 
 36 private:
 37     // Rotate files:
 38     // log.txt -> log.1.txt
 39     // log.1.txt -> log.2.txt
 40     // log.2.txt -> log.3.txt
 41     // log.3.txt -> delete
 42     void rotate_();
 43 
 44     // delete the target if exists, and rename the src file  to target
 45     // return true on success, false otherwise.
 46     bool rename_file_(const filename_t &src_filename, const filename_t &target_filename);
 47 
 48     filename_t base_filename_;
 49     std::size_t max_size_;
 50     std::size_t max_files_;
 51     std::size_t current_size_;
 52     details::file_helper file_helper_;
 53 };
 54 
 55 using rotating_file_sink_mt = rotating_file_sink<std::mutex>;
 56 using rotating_file_sink_st = rotating_file_sink<details::null_mutex>;

include/spdlog/common.h

131 #if defined(_WIN32) && defined(SPDLOG_WCHAR_FILENAMES)
132 using filename_t = std::wstring; 
133     // allow macro expansion to occur in SPDLOG_FILENAME_T
134     #define SPDLOG_FILENAME_T_INNER(s) L##s
135     #define SPDLOG_FILENAME_T(s) SPDLOG_FILENAME_T_INNER(s)
136 #else
137 using filename_t = std::string;
138     #define SPDLOG_FILENAME_T(s) s
139 #endif
328 struct file_event_handlers {                                                                                                                                                                                                                                                                                                                                         
329     file_event_handlers()
330         : before_open(nullptr),
331           after_open(nullptr),
332           before_close(nullptr),
333           after_close(nullptr) {}
334 
335     std::function<void(const filename_t &filename)> before_open;
336     std::function<void(const filename_t &filename, std::FILE *file_stream)> after_open;
337     std::function<void(const filename_t &filename, std::FILE *file_stream)> before_close;
338     std::function<void(const filename_t &filename)> after_close;
339 };

结论

可以看出 参数依次为:

std::string;std::size_t;std::size_t;bool;const file_event_handlers&

#include "itek_log.h" ItkLog::ItkLog():m_init(false){}; ItkLog::~ItkLog() { if (m_init) { this->unInit(); } } bool ItkLog::addConsole(const char* logger_name, const OutLevel level) { auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>(); console_sink->set_level((spdlog::level::level_enum)level); updateSinkCollection(logger_name, console_sink); return true; } bool ItkLog::addRotatingFile(const char* logger_name, const char* file_name, const int max_file_size, const int max_file_num, const OutLevel level) { auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(file_name, max_file_size, max_file_num); file_sink->set_level((spdlog::level::level_enum)level); updateSinkCollection(logger_name, file_sink); return true; } bool ItkLog::addDailyFile(const char* logger_name, const char* file_name, const int hour, const int minute, const OutLevel level) { auto daily_sink = std::make_shared<spdlog::sinks::daily_file_sink_mt>(file_name, hour, minute); daily_sink->set_level((spdlog::level::level_enum)level); updateSinkCollection(logger_name, daily_sink); return true; } bool ItkLog::init(const OutMode mode, const std::string format) { if (m_init) { return false; } m_init = true; if (mode == ASYNC) { for (auto element : log_sinks) { std::string t_log_name = element.first; std::vector<std::shared_ptr<spdlog::sinks::sink>> t_sink(element.second); auto t_thread_pool = std::make_shared<spdlog::details::thread_pool>(1024000, 1); auto t_logger = std::make_shared<spdlog::async_logger>(t_log_name, std::begin(t_sink), std::end(t_sink), t_thread_pool, spdlog::async_overflow_policy::block); /*updateThreadPool(t_log_name, t_thread_pool);*/ t_logger->set_level(spdlog::level::trace); t_logger->flush_on(spdlog::level::warn); spdlog::register_logger(t_logger); } } else if (mode == SYNC) { for (auto element : log_sinks) { std::string t_log_name = element.first; std::vector<std::shared_ptr<spdlog::sinks::sink>> t_sink(element.second); auto t_logger = std::make_shared<spdlog::logger>(t_log_name, std::begin(t_sink), std::end(t_sink)); t_logger->set_level(spdlog::level::trace); t_logger->flush_on(spdlog::level::warn); spdlog::register_logger(t_logger); } } spdlog::flush_every(std::chrono::seconds(3)); spdlog::set_pattern(format); return true; } void ItkLog::unInit() { spdlog::shutdown(); //spdlog::drop_all(); //spdlog::shutdown(); } void ItkLog::updateSinkCollection(const std::string logger_name, std::shared_ptr<spdlog::sinks::sink> sink) { auto iter = log_sinks.find(logger_name); if (iter != log_sinks.end()) { iter->second.push_back(sink); } else { std::vector<spdlog::sink_ptr> t_sink; t_sink.push_back(sink); log_sinks[logger_name] = t_sink; } } // void updateThreadPool(const std::string logger_name, std::shared_ptr<spdlog::details::thread_pool> thread_pool) // { // auto iter = m_mapAsyncThreadPool.find(logger_name); // if (iter != m_mapAsyncThreadPool.end()) // { // iter->second = (async_thread_pool); // } // else // { // m_mapAsyncThreadPool[logger_name] = async_thread_pool; // } // }析构函数总是报错
最新发布
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值