Qt使用spdlog乱码问题

news/2024/12/26 19:25:16/文章来源:https://www.cnblogs.com/gepai/p/18634047

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/859405.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis可视化工具推荐:Another Redis Desktop Manager使用教程与下载

Redis是一种高性能的Key-Value数据库,被广泛应用于缓存、消息队列等场景。尽管Redis的命令行工具功能强大,但对于许多开发者而言,使用一款可视化工具可以大大提高操作效率和用户体验。今天为大家推荐一款功能强大的Redis可视化工具——Another Redis Desktop Manager,并提供…

RISC-V篇-VSCode+qemu+gdb可视化调试Linux Kernel

https://zhuanlan.zhihu.com/p/4185359719本文发布于微信公众号:Linux底层小工,欢迎关注,获取更多原创技术文章! “VSCode+qemu+gdb调试OpenSBI确实很爽,那怎能少了调试kernel呢~~” 01 VScode调试MMU开启之前的kernel 有了调试OpenSBI的基础,再调试kernel,那设置相当简…

中考阅读理解深入逻辑分析-006 A Streams Journey to the Sea 一条小溪通往大海的旅程

文章正文 A little stream ran down from a high mountain far, far away through many villages and forests, until it reached a desert. The stream then thought,“I’ve been through countless difficulties. I should have no problem crossing the desert!”But as sh…

2024-2025-1 20241322 《计算机基础与程序设计》第十四周学习总结

2024-2025-1 20241322 《计算机基础与程序设计》第十四周学习总结 作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标 自学教材《C语言程序设计》…

Chrome 或引入 Gemini AI 功能「Glic」,需访问麦克风;理想同学 App 即将上线支持语音交流、识物

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

洛谷题单指南-线段树的进阶用法-P3834 【模板】可持久化线段树 2

原题链接:https://www.luogu.com.cn/problem/P3834 题意解读:静态区间第k小问题,可持久化线段树(也称为主席树)模版题。 解题思路: 一、朴素想法:如何求完整区间[1,n]第k小 1、权值线段树 设n个数构成序列a,b数组代表a中元素出现的次数,即b数组的构建方式为对每一个a[…

FTP一键安装脚本(linux版)

简述:linux版权限可能会不容易理解,可参考windwos做为基础。一、FTP(linux版) 1. ftp详解 简介: vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。 vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、…

React—01—基本学习,如何在html中直接使用react;

一、react的特点:<script>标签这里要加一个“text/babel”,babel才知道这个<script>标签里要解析js代码,否则babel不会启动。 React 组件是返回标签的 JavaScript 函数:哪个组件是通过改变 state 实现可响应的,或者哪个组件拥有 这个 state。 然后我们需要确定…

记录python+pyside+qml+qtcharts 使用,防踩坑

使用QML-qtquick 进行开发时,有个使用chart图表的需求,看了一大圈,网上都是qmake或是cmake来构建QTchart,用python开发也只搜到QtWidgets模块进行图表绘制。然而我对qtwidgets不是很了解,想要的是QML开发,在使用ChartView{}时一直闪退,没有效果。经历了苦苦搜寻,终于在 h…

制作了一款 pdf 转换图片的工具( csharp 版 )

在 Windsurf 的帮助下,制作了一款 windows 下的 pdf 转换图片(png/jpg/tif)工具。支持递归查找 pdf,一些配置给写死了,适合简单使用。 PDF 批量转图片工具 这是一个功能强大且易用的 PDF 转图片工具,专为批量处理 PDF 文件设计。它能够将 PDF 文件的每一页转换为高质量的…

C# WPF PrintDialog 打印(1)

参考“WPF 打印实例”的文章:https://www.cnblogs.com/gnielee/archive/2010/07/02/wpf-print-sample.html 测试程序: 首先打印Canvas效果:看起来似乎没问题,但是调整窗体尺寸遮挡部分元素:再打印Canvas效果:可以发现PrintVisual方法只打印了可见部分的元素,测试打印Dat…

CentOS8安装

安装方法跟Centos7无差异。 一、下载安装包镜像地址:https://mirrors.aliyun.com/centos-vault/centos/8.2.2004/isos/x86_64/?spm=a2c6h.25603864.0.0.1f647af6cvFFgO 二、安装操作系统 安装界面如下, 三、后续工作a、配置ip地址 [root@localhost ~]# cat /etc/sysconfi…