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