添加日志轮换功能
时间: 2023-08-18 07:20:50 浏览: 221
日志管理系统 增加修改功能
好的,我来为您添加日志轮换功能。首先,我需要在 `Logger` 类中添加一个 `rotating_file_sink` 对象,并将其作为 sink 传递给 logger 对象。然后,我需要设置日志文件的最大大小和最大文件数,以控制日志轮换的行为。
以下是更新后的 `Logger` 类代码:
```c++
#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/rotating_file_sink.h>
class Logger {
public:
Logger() {
// 创建控制台输出 sink
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
// 创建文件输出 sink
auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>("log.txt", 1024 * 1024 * 50, 3);
// 创建 logger
logger_ = std::make_shared<spdlog::logger>("my_logger", spdlog::sinks_init_list{console_sink, file_sink});
// 设置日志级别
logger_->set_level(spdlog::level::trace);
}
void log(const char* file, int line, spdlog::level::level_enum level, const std::string& msg) {
// 根据日志级别选择不同的颜色
switch (level) {
case spdlog::level::trace:
logger_->trace("{}:{} - {}", file, line, msg);
break;
case spdlog::level::debug:
logger_->debug("{}:{} - {}", file, line, msg);
break;
case spdlog::level::info:
logger_->info("{}:{} - {}", file, line, msg);
break;
case spdlog::level::warn:
logger_->warn("{}:{} - {}", file, line, msg);
break;
case spdlog::level::err:
logger_->error("{}:{} - {}", file, line, msg);
break;
case spdlog::level::critical:
logger_->critical("{}:{} - {}", file, line, msg);
break;
default:
break;
}
}
private:
std::shared_ptr<spdlog::logger> logger_;
};
int main() {
// 初始化 logger
Logger logger;
// 打印日志
for (int i = 0; i < 100000; ++i) {
logger.log(__FILE__, __LINE__, spdlog::level::info, "Hello, world!");
}
return 0;
}
```
在上述示例中,我使用 `rotating_file_sink_mt` 创建了一个支持日志轮换的文件输出 sink。其中,第一个参数是日志文件名,第二个参数是单个日志文件的最大大小(这里设置为 50MB),第三个参数是最大的日志文件数(这里设置为 3)。这意味着,当一个日志文件达到 50MB 时,会自动创建一个新的日志文件,最多会保留 3 个日志文件(包括当前日志文件)。如果您需要自定义日志轮换行为,可以参考 spdlog 提供的其他 sink,并根据自己的需求进行修改。
现在,在程序运行时,如果日志文件大小达到 50MB,或者超过 3 个日志文件时,会自动按照一定的规则进行日志轮换,保证日志文件不会过大,也不会占用过多的磁盘空间。
阅读全文