作为一个库,最基本的应该具有日志功能,在所有潜在错误的地方打日志,方便用户调试.
本文介绍WceUi界面库所有的日志类.
日志类是一个基本功能,我把他加入了全局类变量中,如果你还不知道全局类变量,参考https://www.netpt.net/forum.php?mod=viewthread&tid=40
加入的方法如下,在.h中加入如下代码
DECLARE_GVAR_HEAD(CFhWriteLogFile)
class CGVarManage
{
//在这里加上你要的全局变量,加上前面的先初始化,后面的后初始化
//析构时,后面的先析构,前面的后析构
DECLARE_GVAR_IN_ORDER(CFhWriteLogFile);
}
然后在.cpp中加入如下代码
NS_WCEUI_BEGIN
//这里的顺序是没有关系的
IMPLEMENT_GVAR(CFhWriteLogFile);
这样,我们就有一个全局类变量CFhWriteLogFile了.
CFhWriteLogFile的构造函数中,有一个DefaultInit,代码如下:
void wceui::CFhWriteLogFile::DefaultInit()
{
QString strFilePath = QCoreApplication::applicationFilePath();
if (!strFilePath.isEmpty())
{
QFileInfo fi(strFilePath);
if (fi.isFile())
{
strFilePath += LOGFILE_POSTFIX;
Init(strFilePath, DEFAULT_LOGFILE_SIZE);
}
}
}
这个代码表示,默认会把日志文件放在exe所在的目录,同时会设置默认的日志大小.
日志总有写满的时候,如果写满了,就要循环写,这样可以避免产生的日志文件过大.处理循环写日志的函数为SetFileSize,代码如下
FHBOOL wceui::CFhWriteLogFile::SetFileSize()
{
FHBOOL bResult = FHFALSE;
qint64 llFileSize = 0;
qint64 llNewFileSize = 0;
if (NULL == m_qFile)
{
goto EndOfSetFileSize;
}
llFileSize = m_qFile->size();
if (llFileSize < m_llMaxLogFileSize)
{
bResult = TRUE;
goto EndOfSetFileSize;
}
llNewFileSize = llFileSize - (llFileSize >> 2); //设置文件大小为原来的3/4
if (llNewFileSize > 0) //随便写的一个条件,让后面的{}看起来更自然
{
qint64 pos = llFileSize - llNewFileSize;
m_qFile->seek(pos);
QByteArray qbBuffer = m_qFile->read(llNewFileSize);
m_qFile->seek(0);
m_qFile->write(qbBuffer);
m_qFile->resize(llNewFileSize);
m_qFile->seek(llNewFileSize); //把写的指针移动到文件末尾
m_qFile->flush();
}
bResult = FHTRUE;
EndOfSetFileSize:
if (!bResult)
{
UnInit();
}
return bResult;
}
好了,以上就是实现日志类的关键点,下面我讲日志类相关的API调用
FHBOOL WceUiSetLog(QString strLogFileFullPath, qint64 llMaxLogFileSize)
这个函数有两个参数,第一个参数是自己设置的日志文件的全路径,第二个参数是日志大小
void WceUiWriteLog(WCEUI_LOG_LEVEL errLevel, LPFHCSTR lpszFormat, ...)
这个函数是用来输出日志的,直接调用就可以了,下面是一个调用示范
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
for (int i = 1, j = 100; i < 100000; i++, j--)
{
WceUiWriteLog(WCEUI_LOG_INFO, "%08d hello,hi,我%d是wceui", i, j);
}
return a.exec();
}
附件有全部代码,在win7/ubuntu16上测试通过
备份地址:https://netpt.net/forum.php?mod=viewthread&tid=41