C++

35.QT重定向日志系统--Apple的学习笔记

2021-08-31  本文已影响0人  applecai

一,前言

最近还是处于模仿阶段,就是看别人的工程来寻找学习点。今天练习中大型工程中需要的日志系统。

二,需求

自己移植一个日志系统到QT中,可以将信息以txt形式输出日志信息。

三,设计

我移植的日志系统是spdlog开源代码,先用mingw8.1编译成64bit的静态库文件。然后集成到QT中。此库API使用还是很容易的,参考其example及readme说明文件即可。

四,遇到的问题

  1. QT中的5类日志信息如何重定向到此自定义的日志系统呢?
    答:网上能搜索到答案的。使用 qInstallMessageHandler 注册一个自定义的消息处理器。
  2. release情况下如何还能重定向?
    答:在.pro文件定义一个宏:DEFINES += QT_MESSAGELOGCONTEXT
  3. 核心代码
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();
        }
    });
}

五,小结

我通过学习别人的工程,取其精华去其糟粕。掌握了日志系统的使用,哈哈~

上一篇下一篇

猜你喜欢

热点阅读