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

文章目录

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

0 背景

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

1 Android环境下

结果:
这是在编译器中打印的调试的信息:
Qt 在Windows/Mac/Android下使用日志——————附赠完整代码和示例_第1张图片
下面为使用adb查看MyRatailLog的日志信息:
Qt 在Windows/Mac/Android下使用日志——————附赠完整代码和示例_第2张图片

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
static const char* g_TAG = 0;
#include
#include

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 
#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下使用日志——————附赠完整代码和示例_第3张图片
在Mac环境中的系统日志存在于app包含的运行文件中:
Qt 在Windows/Mac/Android下使用日志——————附赠完整代码和示例_第4张图片

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

#include "maininterface.h"

#include 
#include"qdebug2logcat.h"

#include
#include
#include

#ifdef WINDOWS
#include
#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();
}

你可能感兴趣的:(GUI编程之Qt,adb,android,mac,日志)