Qt使用spdlog乱码问题

Qt使用spdlog输出日志

Qt 提供了 qInstallMessageHandler 函数,允许安装一个自定义的消息处理函数,以拦截和处理 Qt 的日志消息。可以利用这一功能,将日志写入文件。

可以在main文件中定义如下函数:

#include <spdlog/spdlog.h>
#include <spdlog/sinks/rotating_file_sink.h>

//< 全局 spdlog logger
std::shared_ptr<spdlog::logger> qtLogger;

//< 自定义消息处理函数
void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
    // 将 QString 转换为 UTF-8 编码的 std::string
    QByteArray byteArray = msg.toUtf8();
    std::string utf8Msg(byteArray.constData(), byteArray.size());

    switch (type) {
    //< 这里根据自己的需求可以将qt的 不同种类输出 重定向到 自己需要的日志输出接口中
    case QtDebugMsg:{
        qtLogger->debug(utf8Msg);
        spdlog::debug(utf8Msg);
    }break;
    case QtInfoMsg:{
        qtLogger->info(utf8Msg);
        spdlog::info(utf8Msg);
    }break;
    case QtWarningMsg:{
        qtLogger->warn(utf8Msg);
        spdlog::warn(utf8Msg);
    }break;
    case QtCriticalMsg:{
        qtLogger->critical(utf8Msg);
        spdlog::critical(utf8Msg);
    }break;
    case QtFatalMsg:{
        qtLogger->critical(utf8Msg);
        spdlog::critical(utf8Msg);
    }abort();
    }
}

之后可以在main函数中安装消息处理函数:

try {
#ifdef _WIN32
    // 设置控制台代码页为 UTF-8
    SetConsoleOutputCP(CP_UTF8);
#endif
    // 初始化 spdlog
    qtLogger = spdlog::rotating_logger_mt("qt_logger", "SysManger.log", 1048576 * 5, 3);
    spdlog::set_level(spdlog::level::debug);
    spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] %v");

    // 安装自定义消息处理函数
    qInstallMessageHandler(customMessageHandler);

    // 示例日志输出
    qDebug() << "这是一个调试信息";
    qInfo() << "这是一个信息日志";
    qWarning() << "这是一个警告信息";
    qCritical() << "这是一个严重错误信息";

} catch (const spdlog::spdlog_ex &ex) {
    fprintf(stderr, "日志初始化失败: %s\n", ex.what());
    return 1;
}

此时就可以实现中文消息的重定向了,如果你设置了日志文件,则运行程序后会产生响应的日志文件及内容。

但是如果设置了控制台输出,并且使用qt的控制台的话会出现中文乱码的问题。

解决中文乱码

会出现中文乱码是因为qt的程序输出编码格式不是utf8,将qt的控制台输出设置成utf8即可。

依次打开:编辑——》选项(Preferences)——》环境——》Interface,将Text codec for tools设置为UTF-8即可。

Windows Qt程序打开控制台输出日志信息方法(MSVC)

如果是使用CMake管理的系统的话在CMakeLists中添加下面内容即可:

if(MSVC)
    # Set the subsystem to console
    set_target_properties(项目名称 PROPERTIES
        LINK_FLAGS "/SUBSYSTEM:CONSOLE"
    )
endif()

如果启动控制台后输出的中文是乱码,大概率是因为控制台默认编码格式不是UTF8,但是Qt输出的信息是UTF8所导致。在main函数中添加下面代码即可设置控制台为UTF8编码:

#ifdef _WIN32
        // 设置控制台代码页为 UTF-8
        SetConsoleOutputCP(CP_UTF8);
#endif
posted @ 2024-12-26 19:22  密码战士  阅读(5)  评论(0编辑  收藏  举报