请用代码封装设计一个功能复杂完善的spdlog日志系统
时间: 2024-02-18 15:02:28 浏览: 98
好的,以下是一个基于Qt的spdlog日志系统的示例代码,这个日志系统封装了spdlog库,并包含了一些常用的功能:
```
#pragma once
#include <QObject>
#include "spdlog/spdlog.h"
class Log : public QObject
{
Q_OBJECT
public:
static Log& getInstance() {
static Log instance;
return instance;
}
void init(const std::string& logFilePath, spdlog::level::level_enum level = spdlog::level::trace) {
// 创建默认日志器
auto logger = spdlog::basic_logger_mt("basic_logger", logFilePath);
// 设置默认日志等级
logger->set_level(level);
logger->flush_on(level);
// 添加输出器
auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
console_sink->set_level(level);
logger->sinks().push_back(console_sink);
// 添加滚动策略
auto daily_sink = std::make_shared<spdlog::sinks::daily_file_sink_mt>(logFilePath + ".%Y-%m-%d", 23, 59);
daily_sink->set_level(level);
logger->sinks().push_back(daily_sink);
// 自定义日志格式
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [thread %t] %v");
// 设置默认日志器
spdlog::set_default_logger(logger);
}
void log_trace(const std::string& message) {
spdlog::trace(message);
}
void log_debug(const std::string& message) {
spdlog::debug(message);
}
void log_info(const std::string& message) {
spdlog::info(message);
}
void log_warn(const std::string& message) {
spdlog::warn(message);
}
void log_error(const std::string& message) {
spdlog::error(message);
}
void log_critical(const std::string& message) {
spdlog::critical(message);
}
void set_level(spdlog::level::level_enum level) {
spdlog::set_level(level);
}
void flush() {
spdlog::flush_every(std::chrono::seconds(60));
}
void close() {
spdlog::shutdown();
}
private:
Log() {}
Log(Log const&);
void operator=(Log const&);
};
```
这个日志系统封装在一个名为Log的类中,该类包含了init、log_trace、log_debug、log_info、log_warn、log_error、log_critical、set_level、flush和close等方法。
init方法用于初始化日志系统,包括设置日志文件路径、日志等级、日志滚动策略等。
log_trace、log_debug、log_info、log_warn、log_error和log_critical方法用于打印不同级别的日志信息。
set_level方法用于设置日志输出的最低等级。
flush方法用于刷新日志缓存,确保日志信息被及时输出到文件中。
close方法用于关闭日志系统,释放资源。
在使用这个日志系统时,我们可以调用Log类的方法来打印日志信息。以下是一个使用示例:
```
#include <QCoreApplication>
#include "log.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Log& logger = Log::getInstance();
logger.init("logs/test");
logger.log_debug("Debug message");
logger.log_info("Info message");
logger.log_warn("Warning message");
logger.log_error("Error message");
logger.log_critical("Critical message");
logger.set_level(spdlog::level::warn);
logger.log_trace("Trace message");
logger.flush();
logger.close();
return a.exec();
}
```
在这个示例中,我们首先获取Log类的单例实例,然后调用init方法初始化日志系统,设置日志文件路径为logs/test,然后打印不同级别的日志信息,最后调用flush方法刷新日志缓存并调用close方法关闭日志系统。
阅读全文