0
点赞
收藏
分享

微信扫一扫

Qt 在Windows/Mac/Android下使用日志——————附赠完整代码和示例



文章目录

  • ​​0 背景​​
  • ​​1 Android环境下​​
  • ​​1.1 控制日志输出​​
  • ​​1.2 查看日志​​
  • ​​2 windwos/Mac​​

0 背景

一般情况下,我们在使用编译器运行软件的情况下,都可以打印出调试信息,但是如果是发布后的软件,就不能在编译器上看到调试、出错等日志信息,于是就要通过其他方法查看日志信息,一种比较好的方法,就是把软件日志输出到文件中,这样我们就可以通过文件查看。

1 Android环境下

结果:

这是在编译器中打印的调试的信息:

Qt 在Windows/Mac/Android下使用日志——————附赠完整代码和示例_adb

下面为使用adb查看MyRatailLog的日志信息:

Qt 在Windows/Mac/Android下使用日志——————附赠完整代码和示例_android_02

1.1 控制日志输出

控制日志文件:

.h 文件

#ifndef QDEBUG2LOGCAT_H
#define QDEBUG2LOGCAT_H

#ifdef ANDROID
void installLogcatMessageHandler(const char* TAG);
#else
#define installLogcatMessageHandler(TAG)
#endif

#endif // QDEBUG2LOGCAT_H

.cpp文件

#include "qdebug2logcat.h"

//安卓打印日志
#ifdef ANDROID
#include<Android/log.h>
static const char* g_TAG = 0;
#include<QByteArray>
#include<QDebug>

static void messageOutput2Logcat(QtMsgType type, const QMessageLogContext &content, const QString& msg){
int prio = ANDROID_LOG_VERBOSE;
QByteArray localMsg = msg.toLocal8Bit();
switch (type) {
case QtDebugMsg:
prio = ANDROID_LOG_DEBUG;
break;
case QtWarningMsg:
prio = ANDROID_LOG_WARN;
break;
case QtCriticalMsg:
prio = ANDROID_LOG_ERROR;
break;
case QtInfoMsg:
prio = ANDROID_LOG_INFO;
break;
case QtFatalMsg:
prio = ANDROID_LOG_FATAL;
abort();
}
__android_log_write(prio, g_TAG, localMsg.data());
}

void installLogcatMessageHandler(const char *TAG)
{
g_TAG = (TAG == 0? "QDebug":TAG);
qInstallMessageHandler(messageOutput2Logcat);
}
#endif

在main函数中注册日志信息:

#include "maininterface.h"

#include <QApplication>
#include"qdebug2logcat.h"

int main(int argc, char *argv[])
{
//android调试
#ifdef ANDROID
installLogcatMessageHandler("MyRatailLog");
//安装adb后
//查看日志方法:adb logcat -v time -s MyRatailLog
#else

QApplication a(argc, argv);
MainInterface w;
w.show();
return a.exec();
}

1.2 查看日志

安装adb,然后使用adb指令查看。

例如在Mac下安装adb,

  • 1,首先下载Android SDK;
  • 2,打开mac终端,输入以下指令(进入用户目录):
cd ~
  • 3,输入 open -e .bash_profile命令查看.bash_profile文件是否存在,如果没有则在终端输入下面的指令,创建.bash_profile文件:
touch .bash_profile
  • 4,编辑.bash_profile文件,使用下面的指令:
sudo vim ~/.bash_profile

然后在文件中,输入:

ANDROID_HOME=/Users/apple/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools

其中:​​ANDROID_HOME=/Users/apple/Library/Android/sdk​​为自己Android SDK的安装路径

输入完成后,按下esc键,按​​shift + ;​​,再按​​wq​​退出。

  • 5,输入source .bash_profile进行更新;
  • 6, 输入adb 验证是否成功。

2 windwos/Mac

结果:

在windwos环境中的日志信息存在运行文件的路径下:

Qt 在Windows/Mac/Android下使用日志——————附赠完整代码和示例_mac_03

在Mac环境中的系统日志存在于app包含的运行文件中:

Qt 在Windows/Mac/Android下使用日志——————附赠完整代码和示例_adb_04

下面为在main函数中的代码:

#include "maininterface.h"

#include <QApplication>
#include"qdebug2logcat.h"

#include<QLabel>
#include<stdio.h>
#include<stdlib.h>

#ifdef WINDOWS
#include<direct.h>
#define MAX_PATH 200
#endif

static FILE* g_log_fp = 0;
static void closeLogFile(){
fclose(g_log_fp);
}

static void messageOutput2Logcat(QtMsgType type, const QMessageLogContext &content, const QString& msg){
QByteArray localMsg = msg.toLocal8Bit();
switch (type) {
case QtDebugMsg:
fprintf(g_log_fp, "Debug: %s (%s:%u, %s)\n",
localMsg.constData(),
content.file, content.line,
content.function
);
break;
case QtWarningMsg:
fprintf(g_log_fp, "Warning: %s (%s:%u, %s)\n",
localMsg.constData(),
content.file, content.line,
content.function
);
break;
case QtCriticalMsg:
fprintf(g_log_fp, "Critical: %s (%s:%u, %s)\n",
localMsg.constData(),
content.file, content.line,
content.function
);
break;
case QtInfoMsg:
fprintf(g_log_fp, "Info: %s (%s:%u, %s)\n",
localMsg.constData(),
content.file, content.line,
content.function
);
break;
case QtFatalMsg:
fprintf(g_log_fp, "Fatal: %s (%s:%u, %s)\n",
localMsg.constData(),
content.file, content.line,
content.function
);
abort();
}
}

int main(int argc, char *argv[])
{
//android调试
#ifdef ANDROID
installLogcatMessageHandler("MyRatailLog");
//安装adb后
//查看日志方法:adb logcat -v time -s MyRatailLog
#else

#ifdef WINDOWS //windwos调试
char buffer[MAX_PATH];
getcwd(buffer, MAX_PATH);
strcat(buffer, "/ratail.log");
g_log_fp = fopen(buffer , "wt");
#else //mac调试
g_log_fp = fopen("ratail.log" , "wt");
#endif
atexit(closeLogFile); //关闭日志文件
qInstallMessageHandler(messageOutput2Logcat);
#endif


QApplication a(argc, argv);
MainInterface w;
w.show();
return a.exec();
}



举报

相关推荐

0 条评论