文章目录
- 0 背景
- 1 Android环境下
- 1.1 控制日志输出
- 1.2 查看日志
- 2 windwos/Mac
0 背景
一般情况下,我们在使用编译器运行软件的情况下,都可以打印出调试信息,但是如果是发布后的软件,就不能在编译器上看到调试、出错等日志信息,于是就要通过其他方法查看日志信息,一种比较好的方法,就是把软件日志输出到文件中,这样我们就可以通过文件查看。
1 Android环境下
结果:
这是在编译器中打印的调试的信息:

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

1.1 控制日志输出
控制日志文件:
.h 文件
void installLogcatMessageHandler(const char* TAG);
// QDEBUG2LOGCAT_H.cpp文件
//安卓打印日志
static const char* g_TAG = 0;
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);
}
在main函数中注册日志信息:
int main(int argc, char *argv[])
{
//android调试
    installLogcatMessageHandler("MyRatailLog");
//安装adb后
//查看日志方法:adb logcat -v time -s MyRatailLog
    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环境中的日志信息存在运行文件的路径下:

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

下面为在main函数中的代码:
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调试
    installLogcatMessageHandler("MyRatailLog");
//安装adb后
//查看日志方法:adb logcat -v time -s MyRatailLog
//windwos调试
       char   buffer[MAX_PATH];
       getcwd(buffer, MAX_PATH);
       strcat(buffer, "/ratail.log");
       g_log_fp = fopen(buffer , "wt");
//mac调试
    g_log_fp = fopen("ratail.log" , "wt");
       atexit(closeLogFile); //关闭日志文件
       qInstallMessageHandler(messageOutput2Logcat);
    QApplication a(argc, argv);
    MainInterface w;
    w.show();
    return a.exec();
}









