一,前言
最近还是处于模仿阶段,就是看别人的工程来寻找学习点。今天练习中大型工程中需要的日志系统。
二,需求
自己移植一个日志系统到QT中,可以将信息以txt形式输出日志信息。
三,设计
我移植的日志系统是spdlog开源代码,先用mingw8.1编译成64bit的静态库文件。然后集成到QT中。此库API使用还是很容易的,参考其example及readme说明文件即可。
四,遇到的问题
- QT中的5类日志信息如何重定向到此自定义的日志系统呢?
答:网上能搜索到答案的。使用qInstallMessageHandler
注册一个自定义的消息处理器。 - release情况下如何还能重定向?
答:在.pro文件定义一个宏:DEFINES += QT_MESSAGELOGCONTEXT - 核心代码
void setupLogger(bool verbose)
{
qtDefaultLogger = spdlog::basic_logger_mt("RTESim-qt", "logs/basic-log.txt");//spdlog::stdout_color_mt("RTESim-qt");
if (verbose) {
qtDefaultLogger->set_level(spdlog::level::debug);
}
// 日志输出重定向
qInstallMessageHandler([](QtMsgType type, const QMessageLogContext& context, const QString& msg) {
QByteArray localMsg = msg.toLocal8Bit();
switch (type) {
case QtDebugMsg:
qtDefaultLogger->debug(
"[{}@{}] {}", context.file ? localFile(context.file) : "", context.line, msg.toStdString());
break;
case QtInfoMsg:
qtDefaultLogger->info(
"[{}@{}] {}", context.file ? localFile(context.file) : "", context.line, msg.toStdString());
break;
case QtWarningMsg:
qtDefaultLogger->warn(
"[{}@{}] {}", context.file ? localFile(context.file) : "", context.line, msg.toStdString());
break;
case QtCriticalMsg:
qtDefaultLogger->critical(
"[{}@{}] {}", context.file ? localFile(context.file) : "", context.line, msg.toStdString());
break;
case QtFatalMsg:
qtDefaultLogger->error(
"[{}@{}] {}", context.file ? localFile(context.file) : "", context.line, msg.toStdString());
std::abort();
}
});
}
五,小结
我通过学习别人的工程,取其精华去其糟粕。掌握了日志系统的使用,哈哈~
网友评论