g_pLog
2024-09-01 12:00:46
g_pLog = new CLog("log");
g_pLog->Enable();
g_pScrLog = new CLog("data");
g_pScrLog->Enable();
CString srelog= _T("log...");
g_pLog->WriteLogFile(srelog);
#include <sys/stat.h>
#include <fcntl.h>
#include <io.h>
#include <afxmt.h>
#define MAX_ROW 5000
/**********************************************************************************
程序在当前目录下生成日志文件夹(如果该文件夹存在,则不生成),
每天的日志放在一个以当天日期命名的文件夹中。
MAX_ROW 定义一个日志文件的最大行数,一个日志文件达到这个行数后即关闭,并创建一个新文件。
**********************************************************************************/
class CLog
{
public:
CLog(char* directory);
~CLog();
public:
void Disable(); // 关闭日志功能
void Enable(); // 打开日志功能
void WriteLogFile(const char* fmt, ... );// 写日志函数
void DeleteLogFile();
protected:
int NewLogFile(); // 创建新日志文件
BOOL IsChangeDay(); // 判断是否跨天(凌晨0点)
CString GetCurntTime(); // 获得当前时间字符串,格式为 200709061150
BOOL DelTree(LPCTSTR lpszPath);
private:
int m_filehandle;
int m_row;
int m_dirnum;
int m_filenum;
BOOL m_needlog;
char m_sContent[*];
CString m_strContent;
CString m_sCurtTime;
CString m_sYestady;
CString m_sToday;
CString m_sCurtDir;
CString m_sLogDir;
CString m_sLogDayDir;
CCriticalSection m_cs;
};
extern CLog *g_pLog;
extern CLog *g_pScrLog;
#include "stdafx.h"
#include "Log.h" #include <direct.h> CLog *g_pLog; // 日志类指针
CLog *g_pScrLog; // 设备原始数据记录指针 /* ==============
创建日志文件 参数:
directory 目录名称
返回值:
无
*///=============
CLog::CLog(char* directory)
{
m_row = ;
m_filehandle = ;
m_dirnum = ;
m_filenum = ;
m_sCurtTime = _T("");
m_sToday = _T("");
m_sYestady = _T("");
m_sCurtDir = _T("");
m_sLogDir = _T("");
m_needlog = FALSE; GetCurrentDirectory(_MAX_PATH,m_sCurtDir.GetBuffer(_MAX_PATH));
m_sCurtDir.ReleaseBuffer(); CString sDirName;
CFileFind f;
BOOL bHasLogDir = FALSE;
BOOL bFind = f.FindFile(m_sCurtDir + "\\*.*"); // 文件是否存在 while (bFind)
{
bFind = f.FindNextFile(); if (f.IsDots())
continue; if (f.IsDirectory())
{
sDirName = f.GetFileName();
sDirName.MakeLower();
if (sDirName == (CString)directory)
{
bHasLogDir = TRUE;
break;
}
}
} m_sLogDir = m_sCurtDir + (CString)"\\" + (CString)directory; if (!bHasLogDir)
{
_mkdir(m_sLogDir);
} CString strTime = GetCurntTime (); m_sToday = strTime.Mid(,);
} CLog::~CLog()
{
if(m_filehandle != )
_close(m_filehandle);
} /* ==============
创建日志文件 参数:
无
返回值:
0 成功.-1 失败
*///=============
int CLog::NewLogFile()
{
CString strLogfileName; if (m_filenum > )
{
_close(m_filehandle);
} strLogfileName = m_sLogDayDir + (CString)"\\" + m_sCurtTime + (CString)".Log"; if ((m_filehandle=_open(strLogfileName, _O_WRONLY)) == -)
{
if ((m_filehandle=_open(strLogfileName, _O_WRONLY|_O_CREAT|O_TRUNC, _S_IREAD|_S_IWRITE)) == -)
{
printf("cannot create log file:%s\n",strLogfileName);
return -;
}
} m_filenum++;
return ;
} /* ==============
判断是否跨天(凌晨0点) 参数:
无
返回值:
false 当天
true 跨天
*///=============
BOOL CLog::IsChangeDay()
{
m_sCurtTime = GetCurntTime();
m_sToday = m_sCurtTime.Mid(,); if (m_sToday != m_sYestady)
{
m_sYestady = m_sToday;
m_sLogDayDir = m_sLogDir + (CString)"\\" + m_sToday;
_mkdir(m_sLogDayDir);
return TRUE;
} return FALSE;
} /* ==============
写日志函数 参数:
要记录的内容
返回值:
无
*///=============
void CLog::WriteLogFile(const char* fmt, ... )
{
if (!m_needlog)
return; m_cs.Lock(); if (m_row >= MAX_ROW || IsChangeDay())
{
if (NewLogFile() == -)
{
m_cs.Unlock();
return;
}
m_row = ;
} va_list v_args;
va_start(v_args,fmt);
vsprintf( m_sContent, fmt, v_args );
va_end( v_args ); CString strTime;
CTime cTime = CTime::GetCurrentTime();
strTime = _T("") + cTime.Format("%y-%m-%d %H:%M:%S"); m_strContent = (CString)"[" + strTime + (CString)"]" + (CString)m_sContent + "\n"; _write(m_filehandle, m_strContent, m_strContent.GetLength());
m_row++; m_cs.Unlock();
} /* ==============
获得当前时间字符串,格式为 20070906 参数:
无
返回值:
当前时间字符串
*///============= CString CLog::GetCurntTime()
{
CString strTime; CTime cTime = CTime::GetCurrentTime();
strTime = _T("") + cTime.Format("%y%m%d%H%M%S"); return strTime;
} /* ==============
打开日志功能 参数:
无
返回值:
无
*///=============
void CLog::Enable()
{
m_needlog = TRUE;
} /* ==============
关闭日志功能 参数:
无
返回值:
无
*///=============
void CLog::Disable()
{
m_needlog = FALSE;
} /* ==============
删除7天前的日志 参数:
无
返回值:
无
*///=============
void CLog::DeleteLogFile()
{
CString iFlieName,iFlieName1,iToday,TStr;
int k,k1,k2;
char s[] = {'\0'};
TStr = GetCurntTime();
iToday = TStr.Mid(,);
CFileFind ff;
BOOL bFound = ff.FindFile(m_sLogDir+"\\*", );
while(bFound)
{
bFound = ff.FindNextFile(); if (ff.IsDots())
continue; if (ff.IsDirectory())
{
// 这里是目录
iFlieName = ff.GetFilePath();
iFlieName1 = iFlieName.Right(); k = atoi(iToday)/ - atoi(iFlieName1)/;
k1 = atoi(iToday) - atoi(iFlieName1);
k2 = - (atoi(iFlieName1)%) + (atoi(iToday)%);
_tcscpy( s , iFlieName.GetBuffer(iFlieName.GetLength()) ) ;
if ((k>)&&(k<))
{
DelTree((LPCTSTR)s);
}
else if (k == )
{
if (k1 > )
{
DelTree((LPCTSTR)s);
}
}
else if (k == )
{
if (k2 > )
{
DelTree((LPCTSTR)s);
}
}
else
{
if ((atoi(iToday)/-atoi(iFlieName1)/)==)
{
if ((atoi(iFlieName1)%)/ == )
{
if (k2 > )
{
DelTree((LPCTSTR)s);
}
}
else
{
DelTree((LPCTSTR)s);
}
}
else
{
DelTree((LPCTSTR)s);
}
}
}
}
ff.Close();
} /* ==============
删除文件夹 参数:
文件夹的路径
返回值:
删除是否成功
*///=============
BOOL CLog::DelTree(LPCTSTR lpszPath)
{
SHFILEOPSTRUCT FileOp;
FileOp.fFlags = FOF_NOCONFIRMATION;
FileOp.hNameMappings = NULL;
FileOp.hwnd = NULL;
FileOp.lpszProgressTitle = NULL;
FileOp.pFrom = lpszPath;//路径名从何处来
FileOp.pTo = NULL;//
FileOp.wFunc = FO_DELETE;
return SHFileOperation(&FileOp) == ;
}
最新文章
- MySQL配置文件改变了datadir值
- android 文字图片合成
- Ⅰ.net通信指前提
- 【jmeter】测试报告优化<;一>;
- LeetCode Search in Rotated Sorted Array 在旋转了的数组中查找
- laravel多种安装方法
- Node.js初探之实现能向前台返回东西的简单服务器
- react-redux单元测试(基于react-addons-test-utils,mocha)
- 使用CROS解决跨域问题
- 【BZOJ】 4810: [Ynoi2017]由乃的玉米田
- day1 diff命令递归比较目录下的文件
- throws和throw的区别
- linux系统下top命令参数详解
- Jsp中如何通过Jsp调用Java类中的方法
- 404 Note Found 队- BETA 版冲刺前准备
- 【20181031T2】几串字符【数位DP思想+组合数】
- Qt emit的使用
- JavaScript权威指南--客户端存储
- jni调用 java.lang.UnsatisfiedLinkError: no segmentor_jni in java.library.path
- strcmp返回值布尔类型的判断
热门文章
- Fliptile(枚举+DFS)
- LayUI 上传IE11上传格式错误之后, layer.load(1)的动画一直在,没有关闭(仅限IE11)
- 管中窥豹——框架下的SQL注入 Java篇
- springboot项目启动报错 url&#39; attribute is not specified and no embedded datasource could be configured
- 【linux】【mysql】mysql主从数据库
- APP自動化測試腳本3
- django开发后台接口error 10053/10054
- tomcat下的路径问题
- 夯实Java基础系列7:一文读懂Java 代码块和执行顺序
- mybatis-generator生成数据对象