在第一篇中有人问,如果qInstallMessageHandler
注册函数注册不了的情况下怎么办,在这里说一下我现在日志文件使用的方法,以及写多个日志文件时我的方案。
先附一个第一篇log日志的原文,有需要的可以进去看一下:https://blog.csdn.net/bloke_come/article/details/76090845
这里说一下,这一篇写日志的思路,来源于第一篇,原来需要注册,我这里不再进行注册,直接进行写入,示例代码如下:
// 将这一部分封装为函数,调用函数即可
// strLogInfo 为传入参数
static QMutex mutexFileHttps;
mutexFileHttps.lock();
QString context_info = QString("%1").arg(strLogInfo);
QString current_date_time = QTime::currentTime().toString("hh:mm:ss");
QString current_date = QString("(%1)").arg(current_date_time);
QString message = QString("%1 %2").arg(current_date).arg(context_info);
QString strCurDay = QDate::currentDate().toString("yyyy_MM_dd");
QString strFileName = "";
#if defined (Q_OS_WIN)
strFileName = QString("C:/Log/Https_log_") + strCurDay + QString(".txt");
#elif defined (Q_OS_LINUX)
strFileName = QString("../Log/Https_log_") + strCurDay + QString(".txt");
#endif
QFile fileHttps(strFileName);
fileHttps.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream text_stream(&fileHttps);
// text_stream.setCodec("UTF-8");
text_stream << message << "\r\n";
fileHttps.flush();
fileHttps.close();
deleteFile("03",strFileName); // 这个函数是用来删除日志的(日志保留7天),到某一个固定时间,对日志进行删除
mutexFileHttps.unlock();
void deleteLogFile(QString strDeleteTime , QString strPath)
{
if(QTime::currentTime().toString("hh") != strDeleteTime)
{
return;
}
// 根据自己的文件名长度,修改后面的数字
QString strTmpPath = strPath.left(strPath.length() - 25);
QDir dir = QDir(strTmpPath);
//要判断路径是否存在
if(!dir.exists())
return ;
dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);//实现对文件的过滤
dir.setSorting(QDir::Size | QDir::Reversed);//实现对文件输出的排序
QFileInfoList list = dir.entryInfoList();
QStringList string_list;
for (int i = 0; i < list.size(); ++i)
{
QFileInfo fileInfo = list.at(i);
QString suffix = fileInfo.suffix();
if(QString::compare(suffix, QString("txt"),Qt::CaseInsensitive) == 0)//通过QFileInfo来实现对文件类型的过滤
{
QString absolute_file_path = fileInfo.absoluteFilePath();
string_list.append(absolute_file_path);
}
}
for(int index = 0; index < string_list.size(); index++)
{
QString strFilePath = string_list.at(index);
QString stryyyyMMddtxt = strFilePath.right(14);
QString stryyyyMMdd = stryyyyMMddtxt.left(10);
QDate fileDateTime = QDate::fromString(stryyyyMMdd, "yyyy_MM_dd");
QDate curDateTime = QDate::currentDate();
QDate curDeleteTime = curDateTime.addDays(-7);
if(fileDateTime < curDeleteTime)
{
QFile fileDelete(strFilePath);
fileDelete.remove();
}
}
}
可能有人注意到了,我获取时间和日期分别用的:QTime
和QDate
这两个类。这里说明一下,使用这两个的原因是,使用QDateTime在运行一段时间后会出现(数字)乱码,这个我到现在为止也不清楚出现的原因,有人说是中文导致的,但是我这只有阿拉伯数字,而且乱码部分还有一定规律,下面附乱码图片,有人知道乱码原因,评论一下出现的原因,不胜感激。后来尝试修改,发现使用这两个后,到目前为止运行大约3个月左右了,没有再次出现,所以认为得到了解决,就延续了下来。
我这两个函数封装了一个类,这个类采用单例模式,保证使用同一个内存空间,下面附源码地址:https://download.csdn.net/download/bloke_come/12272889
源码中可能会有一些的缺头文件或者多头件的情况,合理处理这种情况即可(出现这种问题的原因是:部分变量是直接从自定义的全局变量中获取的)
这里对QFile在Linux下使用时候有的一个小坑进行下说明:
如果QFile *file = new QFile();
这样使用的,那么QTextStream 部分一定要通过flush 强刷入文件
否者会出现段错误
别问为什么会知道,因为碰到了╮(╯▽╰)╭
下面附Linux错误用法: