0 背景
一般情况下,我们在使用编译器运行软件的情况下,都可以打印出调试信息,但是如果是发布后的软件,就不能在编译器上看到调试、出错等日志信息,于是就要通过其他方法查看日志信息,一种比较好的方法,就是把软件日志输出到文件中,这样我们就可以通过文件查看。
1 Android环境下
结果:
这是在编译器中打印的调试的信息:
下面为使用adb查看MyRatailLog的日志信息:
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环境中的日志信息存在运行文件的路径下:
在Mac环境中的系统日志存在于app包含的运行文件中:
下面为在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();
}