#include "savelogaffair.h"
#include <QCoreApplication>
#include <QList>
#include <QDateTime>
#include <QFile>
#include <string>
using namespace std;
// 获取当前时间
string LogGetCurrentTime(bool bPathFlag = false)
{
QDateTime curTime = QDateTime::currentDateTime();
QString strCurTime;
if(!bPathFlag)
strCurTime = curTime.toString("yyyy.MM.dd hh:mm:ss");
else
strCurTime = curTime.toString("yyyy_MM_dd");
return strCurTime.toStdString();
}
// 日志记录数据
typedef QList<string> LogData_List;
// 日志存储列表
class LogDataList
{
public:
LogDataList(){ClearData();}
~LogDataList(){ClearData();}
public:
// 向list中存储数据
void PushData(string data)
{
QMutexLocker lock(&m_Mutex);
m_logDataList.append(data);
}
// 从list中取出指定序号的数据项,并删除之,如获取失败,则返回false
bool PopData(string& data, int iIndex = 0)
{
QMutexLocker lock(&m_Mutex);
if(m_logDataList.isEmpty())
return false;
data = m_logDataList.at(iIndex);
m_logDataList.removeAt(iIndex);
return true;
}
// 从list中取出指定序号的数据项,如获取失败,则返回false
bool GetData(string& data, int iIndex = 0)
{
QMutexLocker lock(&m_Mutex);
if(m_logDataList.isEmpty())
return false;
data = m_logDataList.at(iIndex);
return true;
}
// 判断list是否为空
bool IsEmpty()
{
QMutexLocker lock(&m_Mutex);
return m_logDataList.isEmpty();
}
// 清空队列
void ClearData()
{
QMutexLocker lock(&m_Mutex);
m_logDataList.clear();
}
private:
QMutex m_Mutex;
LogData_List m_logDataList;
};
static bool g_bInitFlag = false;
static string g_strLogFilePath = "";
static LogDataList g_logDataList;
SaveLogThread::SaveLogThread()
{}
SaveLogThread::~SaveLogThread()
{
SetExitThreadFlag(true);
}
// 设置线程退出标记
void SaveLogThread::SetExitThreadFlag(bool bExitThreadFlag)
{
QMutexLocker lock(&m_Mutex);
m_bExitThreadFlag = bExitThreadFlag;
}
// 获取线程退出标记
bool SaveLogThread::GetExitThreadFlag()
{
QMutexLocker lock(&m_Mutex);
return m_bExitThreadFlag;
}
void SaveLogThread::run()
{
string strLogData;
QFile qFile;
qFile.setFileName(QString::fromStdString(g_strLogFilePath));
bool bOk = qFile.open(QIODevice::WriteOnly);
if(!bOk)
return;
while(!GetExitThreadFlag())
{
if(!g_logDataList.PopData(strLogData))
{
QThread::msleep(10);
continue;
}
else
{
// 记录日志到文件
qFile.write(strLogData.c_str());
}
QThread::msleep(30);
}
qFile.close();
}
static SaveLogThread* g_pThread = nullptr;
// 进入日志模块
void EnterLogModule()
{
if(g_bInitFlag)
return;
g_bInitFlag = true;
g_strLogFilePath = QCoreApplication::applicationDirPath().toStdString() + string("/")
+ LogGetCurrentTime(true) + string(".log");
g_logDataList.ClearData();
g_pThread = new SaveLogThread();
g_pThread->start();
}
// 退出日志模块
void ExitLogModule()
{
if(!g_bInitFlag)
return;
g_pThread->SetExitThreadFlag(true);
QThread::msleep(200);
g_pThread->wait();
delete g_pThread;
g_pThread = nullptr;
g_logDataList.ClearData();
}
// 保存日志信息
void SaveLogInfo(LogLevel lLevel, const char* pStrInfo)
{
if(!g_bInitFlag)
return;
string strTime = LogGetCurrentTime();
string strLogNode;
switch(lLevel)
{
case LogLevel::LevelError:
strLogNode = strTime +" Error: " + pStrInfo + "\r\n";
break;
case LogLevel::LevelAlarm:
strLogNode = strTime +" Alarm: " + pStrInfo + "\r\n";
break;
case LogLevel::LevelNormal:
strLogNode = strTime +" Normal: " + pStrInfo + "\r\n";
break;
default:
return;
}
g_logDataList.PushData(strLogNode);
}