Qt与spdlog乱码问题如何彻底解决?
摘要:Qt使用spdlog输出日志 Qt 提供了 qInstallMessageHandler 函数,允许安装一个自定义的消息处理函数,以拦截和处理 Qt 的日志消息。可以利用这一功能,将日志写入文件。 可以在main文件中定义如下函数: #in
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即可。
