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::stringstd::string utf8Msg = msg.toStdString();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-8SetConsoleOutputCP(CP_UTF8);
#endif// 初始化 spdlogqtLogger = 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 consoleset_target_properties(项目名称 PROPERTIESLINK_FLAGS "/SUBSYSTEM:CONSOLE")
endif()
如果启动控制台后输出的中文是乱码,大概率是因为控制台默认编码格式不是UTF8,但是Qt输出的信息是UTF8所导致。在main函数中添加下面代码即可设置控制台为UTF8编码:
#ifdef _WIN32// 设置控制台代码页为 UTF-8SetConsoleOutputCP(CP_UTF8);
#endif