//日志管理类实现
#include "MyLog.h"
//////////////////////////////////////////////////////////////////////////////////////
// 静态变量 //
//////////////////////////////////////////////////////////////////////////////////////
std::string CMyLog::m_strLogPath; //日志文件路径
std::string CMyLog::m_strSingleLogName; //单日志文件名称
std::string CMyLog::m_strCurrentLog; //当前日志文件名称
EMyLogModle CMyLog::m_eModle; //日志文件类型
std::queue<std::string> CMyLog::m_qLogManager; //日志管理队列
pthread_mutex_t CMyLog::m_mutexQueue; //日志队列锁
FILE* CMyLog::m_Filelog; //日志文件
char CMyLog::m_cTmp[1024]; //缓冲区
CMyLog::CMyLog(){}
CMyLog::~CMyLog(){}
//////////////////////////////////////////////////////////////////////////////////////
// 对外接口 //
//////////////////////////////////////////////////////////////////////////////////////
//初始化日志管理类相关成员
void CMyLog::Init(std::string strLogPath)
{
//默认为每天一个日志文件
m_eModle = EL_EVERY_DAY;
//清空日志队列
while (m_qLogManager.size() > 0)
{
m_qLogManager.pop();
}
//初始化互斥锁
pthread_mutex_init(&m_mutexQueue,NULL);
//初始化日志文件
m_Filelog = NULL;
m_strLogPath = strLogPath;
m_strSingleLogName = "";
m_strCurrentLog = " ";
memset(m_cTmp,0,1024);
//启动日记线程
pthread_t threadID;
pthread_create(&threadID,NULL,CreateLogFile,NULL);//启动服务端接收线程
}
//设置日志文件模式
void CMyLog::SetLogFileModle( EMyLogModle eMod ,std::string strFileName)
{
m_eModle = eMod;
if (eMod == EL_ONLYONE)
{
m_strSingleLogName = strFileName;
}
}
//写入日志
std::string CMyLog::NewLog( std::string strLog )
{
std::string strTmp = GetTime();
strTmp += strLog;
pthread_mutex_lock(&m_mutexQueue);
m_qLogManager.push(strTmp);//strLog
pthread_mutex_unlock(&m_mutexQueue);
return strLog;
}
//写入日志
std::string CMyLog::NewLog( const char* pszFormat,... )
{
//LINUX
va_list args;
va_start( args, pszFormat );
memset(m_cTmp,0,1024);
int nRes = vsprintf(m_cTmp, pszFormat, args );
va_end(args);
std::string strTmp =(std::string)m_cTmp;
NewLog(strTmp);
return strTmp;
}
//////////////////////////////////////////////////////////////////////////////////////
// 内部成员函数 //
//////////////////////////////////////////////////////////////////////////////////////
//日志出队
std::string CMyLog::LogOutQueue()
{
std::string strLog = "";
pthread_mutex_lock(&m_mutexQueue);
strLog = m_qLogManager.front();
m_qLogManager.pop();
pthread_mutex_unlock(&m_mutexQueue);
return strLog;
}
//创建日志文件:后台线程
void* CMyLog::CreateLogFile(void*)
{
while(1)
{
if (m_qLogManager.size() == 0)
{
sleep(1);
}else
{
//获取日志信息
std::string strLog = LogOutQueue();
//获取日志文件信息
GetLogFile();
//日志写入日志文件
if (m_Filelog != NULL)
{
fwrite(strLog.c_str(),strLog.length(),1,m_Filelog);
fflush(m_Filelog);
/*fclose(m_Filelog);
m_Filelog = NULL;*/
}
}
}
}
//获取日志文件指针
void CMyLog::GetLogFile()
{
if (m_eModle == EL_ONLYONE)//单一日志模式
{
if (m_Filelog == NULL)
{
std::string strFileNameOnly = m_strLogPath + m_strSingleLogName;
m_Filelog = fopen(strFileNameOnly.c_str(),"a+");
}else
return;
}else//其他模式
{
//获取当天日期
time_t now;
struct tm* timeinfo;
time(&now);
timeinfo = localtime(&now);
std::string strTmp = "";
char cTmp[15];
memset(cTmp,0,15);
//根据模式判断是否需要更换日志文件
if (m_eModle == EL_EVERY_DAY )
{
sprintf(cTmp,"%4d%02d.log",(int)1900+timeinfo->tm_year,(int)1+timeinfo->tm_mon);
}else if (m_eModle == EL_EVERY_MON)
{
sprintf(cTmp,"%4d%02d%02d.log",(int)1900+timeinfo->tm_year,(int)1+timeinfo->tm_mon,(int)timeinfo->tm_mday);
}else
return;
if (IsNeedNewFile(cTmp))//需要重新生成日志文件
{
if (m_Filelog != NULL)//如果原始日志文件未关闭
{
fclose(m_Filelog);
m_Filelog = NULL;
}
//重新生成日志文件
m_strCurrentLog = (std::string)cTmp;
std::string strFileName = m_strLogPath + m_strCurrentLog;
m_Filelog = fopen(strFileName.c_str(),"a+");
}else
return;
}
return;
}
//判断是否需要新的日志文件
bool CMyLog::IsNeedNewFile(std::string strFile)
{
if (m_Filelog == NULL)//日志指针为空
{
return true;
}else
{
if (m_strCurrentLog.compare(" ") == 0)//还没有生成过日志文件
{
return true;
}else//生成过日志文件
{
if (m_strCurrentLog.compare(strFile.c_str()) == 0)//跟当前日期相同,不需要重新生成
{
return false;
}else//跟当前日期不同,需要重新生成
return true;
}
}
}
//获取时间
std::string CMyLog::GetTime()
{
time_t tmNow = time(NULL);
struct tm *local;
local = localtime(&tmNow);
char cTmp[22] = {0};
sprintf(cTmp,"%d-%d-%d %d:%d:%d ",local->tm_year+1900,local->tm_mon+1,local->tm_mday,local->tm_hour,local->tm_min,local->tm_sec);
return (std::string)cTmp;
}
qfl_sdu
- 粉丝: 4292
- 资源: 20
最新资源
- Javase语言学习.zip
- CRC16-CCITT-FALSE
- 圣诞树html展示代码资料.zip
- ATA Command Set -5 (ACS-5).pdf
- wpf 控件库 参考 Demo
- MoonBit 编译器 MoonBit - 文档 - 概览 - 标准库
- CRC8 标准校验CAN报文
- promtail linux 安装包
- 基于微信小程序的中国各地美食推荐平台的设计与实现springboot.zip
- 微信小程序基于BS模式的学生实习与就业管理系统设计与实现springboot.zip
- 微信小程序自助点餐系统springboot.zip
- 【大模型必备】office 转 markdown 的服务实现,基于微软markitdown
- 答题小程序ssm.zip
- 基于微信小程序的水果销售系统的设计与实现springboot.zip
- 基于微信小程序的学生签到系统设计与实现ssm.zip
- “校园资料分享微信小程序”的设计与实现springboot.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈