请在Qt 项目中采用spdlog设计封装一个功能强大齐全的日志系统
时间: 2024-02-18 22:02:55 浏览: 118
qt封装的spdlog日志库
5星 · 资源好评率100%
好的,以下是一个基于spdlog的Qt项目中的日志系统,包含了日志打印信息颜色区分、日志文件轮换、日志压缩等功能。您可以参考这个代码来实现您自己的Qt项目日志系统。
首先,在您的Qt项目中添加spdlog库的头文件和源文件。可以将spdlog的源文件直接放到您的项目文件夹中,然后在.pro文件中添加相应的路径。
```pro
INCLUDEPATH += $$PWD/spdlog/include
SOURCES += $$PWD/spdlog/src/spdlog.cpp
```
接下来,创建一个Logger类,封装spdlog库的接口函数,用于记录日志信息。
logger.h
```c++
#ifndef LOGGER_H
#define LOGGER_H
#include <memory>
#include "spdlog/spdlog.h"
class Logger
{
public:
static Logger& instance();
std::shared_ptr<spdlog::logger> get_console_logger(const std::string& name);
std::shared_ptr<spdlog::logger> get_file_logger(const std::string& name, const std::string& filename);
std::shared_ptr<spdlog::logger> get_rotating_file_logger(const std::string& name, const std::string& filename, size_t max_size, size_t max_files);
std::shared_ptr<spdlog::logger> get_daily_file_logger(const std::string& name, const std::string& filename, int hour, int minute);
std::shared_ptr<spdlog::logger> get_compressed_file_logger(const std::string& name, const std::string& filename, size_t max_size, size_t max_files);
private:
Logger();
};
#endif // LOGGER_H
```
logger.cpp
```c++
#include "logger.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/compressed_file_sink.h"
Logger::Logger()
{
// 初始化spdlog库
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%l%$] [thread %t] %v");
// 如果需要输出到控制台,请取消下面这行代码的注释
//auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
//spdlog::default_logger()->sinks().push_back(console_sink);
}
Logger& Logger::instance()
{
static Logger logger;
return logger;
}
std::shared_ptr<spdlog::logger> Logger::get_console_logger(const std::string& name)
{
return spdlog::stdout_color_mt(name);
}
std::shared_ptr<spdlog::logger> Logger::get_file_logger(const std::string& name, const std::string& filename)
{
return spdlog::basic_logger_mt(name, filename);
}
std::shared_ptr<spdlog::logger> Logger::get_rotating_file_logger(const std::string& name, const std::string& filename, size_t max_size, size_t max_files)
{
return spdlog::rotating_logger_mt(name, filename, max_size, max_files);
}
std::shared_ptr<spdlog::logger> Logger::get_daily_file_logger(const std::string& name, const std::string& filename, int hour, int minute)
{
return spdlog::daily_logger_mt(name, filename, hour, minute);
}
std::shared_ptr<spdlog::logger> Logger::get_compressed_file_logger(const std::string& name, const std::string& filename, size_t max_size, size_t max_files)
{
return spdlog::rotating_logger_mt<spdlog::sinks::compressed_file_sink_st>(name, filename, max_size, max_files);
}
```
最后,在您的Qt项目中使用Logger类来记录日志信息。
```c++
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "logger.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 获取控制台日志器
auto console_logger = Logger::instance().get_console_logger("console");
// 获取文件日志器,使用基本文件记录器
auto file_logger = Logger::instance().get_file_logger("file", "example.log");
// 获取文件日志器,使用按大小轮转的文件记录器
auto rotating_file_logger = Logger::instance().get_rotating_file_logger("rotating_file", "example.rotating", 1024 * 1024 * 5, 3);
// 获取文件日志器,使用按日期轮转的文件记录器
auto daily_file_logger = Logger::instance().get_daily_file_logger("daily_file", "example.%Y-%m-%d.log", 0, 0);
// 获取文件日志器,使用压缩文件记录器
auto compressed_file_logger = Logger::instance().get_compressed_file_logger("compressed_file", "example.gz", 1024 * 1024 * 5, 3);
// 输出带有颜色的信息
console_logger->info("\033[0;32mThis is a green message!\033[0m");
console_logger->warn("\033[0;33mThis is a yellow warning!\033[0m");
console_logger->error("\033[0;31mThis is a red error!\033[0m");
// 记录日志信息到文件
file_logger->info("This is a file message!");
rotating_file_logger->info("This is a rotating file message!");
daily_file_logger->info("This is a daily file message!");
compressed_file_logger->info("This is a compressed file message!");
}
MainWindow::~MainWindow()
{
delete ui;
}
```
上述代码演示了如何在Qt项目中使用Logger类来记录日志信息,并使用不同的记录器实现文件日志的按大小轮转、按日期轮转、压缩等功能。在输出日志信息时,使用颜色标志符将不同级别的日志信息区分开来。
阅读全文