MadLog是一个功能强大、高性能的C++/Qt日志系统,提供了灵活的日志记录、格式化和输出功能。该系统采用现代C++设计模式,支持多种输出方式,适用于各种规模的Qt应用程序。
MadConsoleSink
)
MadFileSink
)
MadTextEditSink
)
MadPlainTextEditSink
)
MadQtConsoleSink
)
在你的.pro
文件中添加:
qmakeinclude(MadLog/MadLog.pri)
cpp#include "madlogmacros.h"
#include "madconsolesink.h"
#include "madlogmanager.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 设置日志系统
auto manager = MadLogManager::instance();
auto logger = manager->getLogger("default");
// 添加控制台输出器
auto consoleSink = QSharedPointer<MadConsoleSink>::create();
logger->addSink(consoleSink);
// 使用传统日志宏
MAD_INFO("应用程序启动");
MAD_DEBUG("调试信息");
MAD_WARN("警告信息");
MAD_ERROR("错误信息");
// 使用流式日志(推荐)
logger->info(__FILE__, __LINE__, __FUNCTION__) << "应用程序启动";
logger->debug(__FILE__, __LINE__, __FUNCTION__) << "用户ID: " << 12345;
logger->warn(__FILE__, __LINE__, __FUNCTION__) << "连接超时,重试次数: " << 3;
logger->error(__FILE__, __LINE__, __FUNCTION__) << "文件不存在: " << "config.ini";
return app.exec();
}
流式日志提供了更现代、类型安全的日志记录方式:
cpp#include "madlogger.h"
void demonstrateStreamLogging()
{
auto logger = MAD_DEFAULT_LOGGER();
// 基础流式日志
logger->info(__FILE__, __LINE__, __FUNCTION__) << "用户登录成功";
logger->debug(__FILE__, __LINE__, __FUNCTION__) << "处理请求ID: " << 12345;
// 支持多种数据类型
QString username = "admin";
int userId = 1001;
double responseTime = 123.45;
logger->info(__FILE__, __LINE__, __FUNCTION__)
<< "用户: " << username
<< ", ID: " << userId
<< ", 响应时间: " << responseTime << "ms";
// 支持QStringList
QStringList permissions = {"read", "write", "admin"};
logger->debug(__FILE__, __LINE__, __FUNCTION__)
<< "用户权限: " << permissions;
// 支持Qt容器类型
QList<int> numbers = {1, 2, 3, 4, 5};
logger->trace(__FILE__, __LINE__, __FUNCTION__)
<< "处理数字列表,大小: " << numbers.size();
}
cpp#include "madlogmacros.h"
#include "madconsolesink.h"
#include "madfilesink.h"
#include "madqtconsolesink.h"
#include "madlogpatternformatter.h"
void setupAdvancedLogging()
{
auto manager = MadLogManager::instance();
// 设置全局日志级别
manager->setGlobalLevel(MadLogLevel::Debug);
// 创建自定义格式化器
auto formatter = QSharedPointer<MadLogPatternFormatter>::create(
"[%time%] [%level%] [%thread%] [%logger%] %file%:%line% - %msg%");
// 创建多个输出器
auto consoleSink = QSharedPointer<MadConsoleSink>::create(formatter);
auto fileSink = QSharedPointer<MadFileSink>::create("logs/app.log", formatter);
auto qtConsoleSink = QSharedPointer<MadQtConsoleSink>::create(formatter);
// 配置文件输出器
fileSink->setMaxFileSize(10 * 1024 * 1024); // 10MB
fileSink->setMaxBackupCount(5);
// 配置Qt控制台输出器
qtConsoleSink->setCategoryName("myapp");
qtConsoleSink->setUseQtCategories(true);
// 获取日志记录器并添加输出器
auto logger = manager->getLogger("default");
logger->addSink(consoleSink);
logger->addSink(fileSink);
logger->addSink(qtConsoleSink);
}
cppMAD_TRACE("跟踪信息");
MAD_DEBUG("调试信息");
MAD_INFO("一般信息");
MAD_WARN("警告信息");
MAD_ERROR("错误信息");
MAD_CRITICAL("严重错误");
cppint userId = 12345;
QString userName = "张三";
MAD_INFO_F("用户登录: ID=%d, 姓名=%s", userId, userName.toUtf8().constData());
cppbool debugMode = true;
MAD_DEBUG_IF(debugMode, "调试模式已启用");
cppauto networkLogger = MAD_LOGGER("network");
MAD_INFO_L(networkLogger, "网络连接已建立");
cppvoid myFunction()
{
MAD_FUNCTION_ENTER(); // 函数进入
// 函数逻辑...
MAD_FUNCTION_EXIT(); // 函数退出
}
// 或者使用作用域跟踪(推荐)
void myFunction()
{
MAD_SCOPE_TRACKER(); // 自动跟踪整个函数作用域
// 函数逻辑...
// 函数结束时自动记录退出
}
cppvoid performanceTest()
{
MAD_PERF_START(database_query);
// 执行数据库查询...
MAD_PERF_END(database_query); // 自动输出执行时间
}
cpp#include "madtexteditsink.h"
#include "madplaintexteditsink.h"
class MainWindow : public QMainWindow
{
public:
MainWindow(QWidget* parent = nullptr) : QMainWindow(parent)
{
setupUI();
setupLogging();
}
private:
void setupLogging()
{
auto logger = MAD_DEFAULT_LOGGER();
// 添加QTextEdit输出器
auto textEditSink = QSharedPointer<MadTextEditSink>::create(m_logTextEdit);
textEditSink->setMaxLines(1000);
textEditSink->setColorEnabled(true);
logger->addSink(textEditSink);
// 添加QPlainTextEdit输出器
auto plainTextSink = QSharedPointer<MadPlainTextEditSink>::create(m_logPlainTextEdit);
plainTextSink->setMaxLines(1000);
logger->addSink(plainTextSink);
}
QTextEdit* m_logTextEdit;
QPlainTextEdit* m_logPlainTextEdit;
};
cppclass CustomFormatter : public MadLogFormatter
{
public:
QString format(const MadLogMessage& msg) override
{
return QString("[%1] %2: %3")
.arg(QDateTime::fromMSecsSinceEpoch(msg.timestamp).toString("hh:mm:ss"))
.arg(madLogLevelToString(msg.level))
.arg(msg.message);
}
};
// 使用自定义格式化器
auto customFormatter = QSharedPointer<CustomFormatter>::create();
auto sink = QSharedPointer<MadConsoleSink>::create(customFormatter);
内置的MadLogPatternFormatter
支持以下占位符:
占位符 | 描述 | 示例 |
---|---|---|
%time% | 时间戳 | 2023-12-01 14:30:25.123 |
%level% | 日志级别 | INFO , ERROR |
%msg% | 日志消息 | 用户登录成功 |
%logger% | 日志记录器名称 | network , database |
%file% | 源文件名 | main.cpp |
%line% | 行号 | 42 |
%func% | 函数名 | main |
%thread% | 线程ID | 12345 |
示例格式:
cpp"[%time%] [%level%] [%logger%] %file%:%line% - %msg%"
// 输出:[2023-12-01 14:30:25.123] [INFO] [network] main.cpp:42 - 连接建立成功
cppauto fileSink = QSharedPointer<MadFileSink>::create("logs/app.log");
fileSink->setMaxFileSize(50 * 1024 * 1024); // 50MB
fileSink->setMaxBackupCount(10); // 保留10个备份文件
fileSink->setAutoFlushInterval(1000); // 1秒自动刷新
cppauto textEditSink = QSharedPointer<MadTextEditSink>::create(textEdit);
textEditSink->setMaxLines(500); // 最多显示500行
textEditSink->setAutoScroll(true); // 自动滚动
textEditSink->setColorEnabled(true); // 启用彩色显示
textEditSink->setAutoFlushInterval(100); // 100ms刷新间隔
cppauto qtSink = QSharedPointer<MadQtConsoleSink>::create();
qtSink->setCategoryName("myapp.network"); // 设置Qt日志分类
qtSink->setUseQtCategories(true); // 启用Qt分类
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ 日志宏系统 │───▶│ MadLogger │───▶│ MadLogSink │ │ (便捷接口) │ │ (日志记录器) │ │ (输出接口) │ └─────────────────┘ └──────────────────┘ └─────────────────┘ │ │ ▼ ▼ ┌──────────────────┐ ┌─────────────────┐ │ MadLogManager │ │ MadLogFormatter │ │ (管理器-单例) │ │ (格式化接口) │ └──────────────────┘ └─────────────────┘
本项目采用MIT许可证,详见LICENSE文件。
欢迎提交Issue和Pull Request来改进这个项目!
如有问题或建议,请通过以下方式联系:
MadLog - 让日志记录变得简单而强大! 🚀
本文作者:Shiny
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!